grace是什么意思| 车仔面为什么叫车仔面| adem是什么病| 黑暗料理是什么意思| 色字头上一把刀什么意思| 正常的精液是什么样的| 布灵布灵是什么意思| 葛根粉有什么功效和作用| 瘴气是什么意思| 梦见大水牛是什么兆头| 什么是隐形矫正牙齿| 羊经后半边读什么| pin是什么意思啊| 四是什么生肖| 10.16是什么星座| 什么发育成种皮| 杜甫的诗被称为什么| 梦见种菜是什么意思| 生吃苦瓜有什么好处和坏处| 开车是什么意思| 九头身什么意思| 媚骨是什么意思| 颜字五行属什么| 泼皮是什么意思| 12min是什么意思| 荨麻疹是什么引起的| 氟是什么| 婴儿哭久了有什么危害| 口苦口臭吃什么药| 长方形纸可以折什么| camellia是什么意思| 原子序数等于什么| 随遇而安是什么生肖| 手足口病是什么原因引起的| 法益是什么意思| 蚊子怕什么颜色| 红白相间是什么意思| 为什么一直想睡觉| 心脏房颤是什么原因| 二郎神叫什么名字| 考科目二紧张吃什么药| 名士手表属于什么档次| 转隶是什么意思| 艾滋病是什么引起的| 月经前几天是什么期| 长血痣是什么原因| 嗓子不舒服做什么检查| 火水是什么| 流汗有什么好处| 梦见蜂蜜是什么意思| 12月20日是什么星座| 黄金为什么那么贵| 孕酮低会有什么影响| 总蛋白偏低是什么意思| becky是什么意思| 指桑骂槐是什么生肖| 幡然醒悟是什么意思| 六月初四是什么星座| 脊髓空洞是什么意思| 直博生是什么意思| 什么是津液| 湿气重的人不能吃什么| 嗜酸性粒细胞偏高是什么意思| 右侧后背疼是什么原因| 脑供血不足有什么危害| 坎坷人生是什么生肖| 长期低烧是什么原因| 陪伴是最长情的告白下一句是什么| 随餐吃是什么意思| 疏朗是什么意思| 膀胱壁增厚是什么原因| 脚底红润是什么原因| 膨鱼鳃用什么搭配煲汤| 诊刮是什么手术| 大姨妈来了喝什么好| 农历6月21日是什么星座| 怀孕日期是从什么时候开始算| 孩子拉肚子吃什么药| 金色葡萄球菌最怕什么| 金骏眉是什么茶类| 什么样的疤痕影响当兵| 改朝换代是什么意思| 意什么深什么| 菊花像什么比喻句| 3月10号什么星座| 梦见墙倒了有什么预兆| 香蕉什么时候成熟| 整形什么医院好| 培根是什么肉做的| 镇党委副书记是什么级别| 泡脚时间长了有什么坏处| 什么是电子邮件地址| 山东登州府现在叫什么| 农字五行属什么| 白醋泡脚有什么好处| 隐翅虫长什么样子| cno什么意思| 什么是dha| 弢是什么意思| 双侧肾盂无分离是什么意思| 什么炖排骨好吃| 7月8日什么星座| 奢靡是什么意思| 水准仪是测量什么的| 英语6级是什么水平| 维生素e有什么作用| 什么叫粳米| 上火喉咙痛吃什么药| 盗墓笔记讲的是什么故事| 无名指比中指长代表什么| 煮牛肉放什么调料| 羊水指数是什么意思| 咀嚼什么意思| 中午喜鹊叫有什么预兆| 国行是什么意思| 巳时是什么时间| 病毒的繁殖方式是什么| 吃什么可以化掉息肉| 高锰酸钾什么颜色| 洋葱生吃有什么好处| 三十六计第一计是什么| 来龙去脉是什么意思| 我俩太不公平这是什么歌| 心脏在人体什么位置| 罗汉果有什么功效和作用| 甲功三项是检查什么| 偏头痛是什么原因引起的| 胸腔里面像岔气了的疼是什么原因| 牙疼吃什么药止痛快| 尿崩症是什么症状| 为什么冬吃萝卜夏吃姜| 钢笔ef尖是什么意思| 爱豆是什么意思| 什么是睡眠障碍| 礽是什么意思| 什么的气味| 梦见买衣服是什么意思| 干什么挣钱最快| 心肌炎查什么能查出来| 8.2号是什么星座| 什么药治肝最好最安全| 胃溃疡吃什么药好得快| 什么是金融行业| 浅紫色配什么颜色好看| 黄豆加什么打豆浆好喝又营养| cook是什么意思| 侏罗纪是什么意思| 男的尿血是什么原因| 第二次世界大战是什么时候| 肺ca是什么病| 笋不能和什么一起吃| 喝酒后胃疼吃什么药| 脚底痛是什么原因| 什么得什么| 女人肝胆湿热吃什么药| hp感染是什么意思| 稼字五行属什么| 什么是缓刑意思是什么| 鼻子毛白了是什么原因| 旅长是什么军衔| 金牛座和什么星座不合| 蝼蛄吃什么| 吃什么可以护肝养肝| 脾胃虚寒吃什么食物好| 小孩体检挂什么科| 做梦梦见马是什么意思| 年轮是什么意思| 河童是什么意思| 吃灵芝有什么好处| 什么叫软文| 自言自语是什么原因导致| 例假期间吃什么食物好| 耳仓为什么是臭的| 忠贞不渝是什么意思| lycra是什么面料| 夏天吃什么食物| 孕妇吃什么对胎儿好| 刘邦和项羽是什么关系| 小腿前面的骨头叫什么| 利有攸往是什么意思| 皮脂腺囊肿挂什么科| 阴道有褐色分泌物是什么原因| 夏天猪骨煲什么汤最好| 淋病有什么症状| 右眼皮跳是什么原因| 中单是什么意思| 6.14是什么星座| 吃什么提高免疫力| 虎头虎脑是什么生肖| 不知道叫什么名字好| 松针是什么| 以免是什么意思| 什么前什么后| 嗓子疼吃什么药好| 后背疼是什么原因| 十一月份属于什么星座| 辛未日五行属什么| 瘦的快是什么原因| 如火如荼什么意思| 6月23号是什么日子| 肺部结节是什么意思啊| 后背一推就出痧是什么原因| 秋字五行属什么| 舌头变黑是什么原因| 香膏是什么| circle是什么意思| 路上行人匆匆过是什么歌| 梦见手链断了是什么意思| 五花八门是什么意思| 灰指甲挂什么科室| 掂过碌蔗是什么意思| 草龟吃什么蔬菜| 娘娘的意思是什么| 喉咙痛什么原因| 耳结是什么原因造成的| 鱼腥草治什么病| mua是什么意思| 中国最大的岛屿是什么| 厚积薄发是什么意思啊| 2月出生是什么星座| 龙和什么生肖最配| 手上长疣是什么原因造成的| 摩拳擦掌是什么意思| 灰菜有什么功效与作用| 开放性骨折是什么意思| 狗狗体内驱虫用什么药最好| 荆棘什么意思| 麻雀吃什么| 医士是什么职称| 右手背长痣代表什么| 布病是什么症状| 梦见捡钱是什么预兆| 农历5月是什么星座| 安娜苏香水什么档次| 桔色搭配什么颜色好看| 胃胀吃什么| 连襟是什么意思| 菠菜什么时候种最合适| 旭日是什么意思| 有骨气是什么意思| 尿维生素c阳性是什么意思| 嘴巴有异味是什么原因| 眉下有痣代表什么| 心脏属于什么系统| 体感温度是什么意思| 光是什么| 不怕热是什么体质| 牙龈紫色是什么原因| 暖手宝里面是什么| 太阳穴疼痛是什么原因| 梦见大鲤鱼是什么征兆| 心口疼是什么原因引起的| 红斑狼疮是什么引起的| 仪轨是什么意思| 天庭饱满是什么意思| 努尔哈赤是什么意思| 下面瘙痒用什么药| 调节肠道菌群吃什么药| 什么是善良| 子宫直肠凹积液是什么意思| 4月29日是什么星座| 座是什么结构| 吃什么可以增加抵抗力和免疫力| 松子吃多了有什么害处| 百度
打印

专题丨刑事评论:从“刺死辱母者”案看被害人过错

[复制链接]
323|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
博斯|  楼主 | 2018-9-28 11:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
gcc 编译器

1,在使用gcc编译程序时,编译过程可以细分为4个阶段:

    1)预处理

    2)编译

    3)汇编

    4)链接

Linux程序员可以根据自己的需要让gcc在编译的任何阶段结束,检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。与其他常用的编译器一样,gcc 也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。gcc 提供了30多条警告信息和3个警告级别,使用他们有助于增强程序的稳定性和可移植性。



2,使用 gcc

1)gcc 的版本可以使用如下gcc -v命令查看。

2)下面以一个实例来说明如何使用gcc编译器。

    a;在文本编辑器中编辑 hello.c,输入下面内容,并保存为hello.c

        #include<stdio.h>

        int main(int argc,char **argv)

        {

            printf("Hello Ubuntu\n");

        }

    b;要编译这个程序,只要在命令行下执行如下命令:

        lammy@lammy-desktop:~$ gcc hello.c -o hello

        lammy@lammy-desktop:~$ ./hello

        Hello Ubuntu

    c;执行上述命令后,gcc编译器会生成一个名为hello的可执行文件,然后执行./hello就可以看到程序输出的结果了。

    d;命令行中gcc表示用gcc来编译源程序,-o 选项表示要求编译器输出的可执行文件名为hello,而hello.c是源程序文件。

    f;为了更好的了解gcc的工作过程,可以把上述编译过程分成几个步骤单独进行,并观察每步的运行结果。

            第一步是要进行预编译,使用-E参数可以让gcc在预处理结束后停止编译过程:

                lammy@lammy-desktop:~$ gcc -E hello.c -o hello.i

                    此时若查看hello.i文件中的内容,会发现stdio.h的内容确实都插到文件里去了,而且被预处理的宏定义也都做了相应的处理。由于该文档长达

                914行,故没有给出。

            下一步是将hello.i编译为目标代码,这可以通过使用-c参数来完成:

                lammy@lammy-desktop:~$ gcc -c hello.i -o hello.o

                    gcc默认将.i文件看成是预处理后的C语言源代码,因此上述命令将自动跳过预处理步骤而开始执行编译过程,也可以使用-x参数让gcc从指定的步骤

                开始编译。最后一步是将生成的目标文件链接成可执行文件:lammy@lammy-desktop:~$ gcc hello.o -o hello

    g;如果整个程序是由多个源文件组成的,比如说一个有1.c和2.c两个源文件组成的程序,为了对它们进行编译,并最终生成可执行程序drive,可以使用下面这条命

         令:lammy@lammy-desktop:~$ gcc 1.c 2.c -o drive

         此时该命令大致相当于一次执行如下3条命令:

            lammy@lammy-desktop:~$ gcc 1.c -o 1.o

            lammy@lammy-desktop:~$ gcc 2.c -o 2.o

            lammy@lammy-desktop:~$ gcc 1.o 2.o -o drive

    h;如果项目中有100个源文件需要编译,并且每个源文件都包含 10 000 行代码,如果依然相上面那样仅用一条gcc命令来完成编译工作,那么和明显将很费时间的。要

          解决这个问题,关键是要灵活运用gcc,同时还要借助相make这样的工具。关于make,以后再说。

3)gcc 警告提示功能

    a;gcc在编译不符合ANSI/ISO C语言标准的源代码时,如果加上了-pedantic 选项,那么使用了扩展语法的地方将产生相应的警告信息;需要注意的是,-pedantic编译选项并不能保证被编译的程序与ANSI/ISO C语言标准完全兼容,它仅仅用来帮助Linux程序员离这个目标越来越近。

    b;除了-pedantic之外,gcc还有一些其他编译选项也能够产生有用的警告信息。这些选项大多以-W开头,其中最有价值的当数-Wall了,使用它能够使gcc产生尽可能多的警告信息。

    c;在处理警告方面,另一个常用的编译选项是-Werror,它是要求gcc将所有的警告当成错误进行处理,这在使用自动编译工具时非常有用。如果编译时但上-Werror选项,那么gcc会在产生警告的地方停止编译,从而迫使程序员对自己的代码进行修改。

    d;建议在用gcc编译源代码时始终带上-Wall选项,并把他逐渐培养成一种习惯,这对找出常见的隐式编程错误很有帮助。

4)库依赖

    a;函数库实际上就是一些头文件(.h)和库文件(.so或者.a)的集合,虽然Linux下大多数函数都默认将头文件放到/usr/include/目录下,而库文件则放到/usr/lib/目录下,但并不是所有的情况都是这样的。

    b;gcc采用搜索目录的方法来查找所需要的文件,-I选项可以向gcc的头文件搜索路径中添加新的目录。例如如果在/home/lammy/include/目录下有编译时所需要的头文件,可以使用如下命令:lammy@lammy-desktop:~$ gcc lammy.c -I /home/lammy/include -o lammy

    c;同样,如果使用了不在标准位置的库文件,那么可以通过-L选项向gcc的库文件搜索路径中添加新的目录。例如如果在/home/lammy/lib目录下有链接时所需的库文件liblammy.so,可以使用如下命令:lammy@lammy-desktop:~$ gcc lammy.c -L /home/lammy/lib -llammy -o lammy

    d;值得详细解释一下-llibrary选项,他指示gcc去连接库文件library。上面的命令指示gcc去连接库文件lammy.so。Linux下的库文件在命名时有一个约定,那就是应该以lib三个字母开头。因此在用-l选项指定连接的库文件名时可以省去lib三个字母。

    f;Linux下的库文件分为两大类,分别是动态链接库(通常以.so结尾)和静态链接库(通常以.a结尾),两者的差别仅在于程序执行时所需的代码是运行时动态加载的,还是编译时静态加载的。默认情况下,gcc在链接时优先使用动态链接库,只有当动态库不存在时才考虑静态链接库。如果需要的话可以在编译时加上-static选项,强制使用静态链接库。例如如果在/home/lammy/lib/目录下有链接时所需的库文件libfoo.so和libfoo.a,为了让gcc在链接时只用到静态链接库,可以使用下面的命令:lammy@lammy-desktop:~$ gcc foo.c -L /home/lammy/lib -static -lfoo -o lammy

5)gcc代码优化

    gcc提供的代码优化功能非常强大,它通过编译选项-On来控制优化代码的生成,其中n是一个代表优化级别的整数,不同的版本的gcc,n的取值范围及其对应的优化效果并不完全相同,比较典型的范围是从0变化到2或3。

    a;选项-O可以告诉gcc同时减小代码的长度和执行时间,其效果等价于-O1。在这一级别上能够进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳转和延迟退栈两种优化。

    b;选项-O2告诉gcc除了完成所有-O1级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度。

    c;选项-O3则除了完成所有-O2级别的优化之外,还包括循环展开和其他一些与处理器特性相关的优化工作。

    d;一般数字n越大优化的等级越高,同时意味着程序的运行速度越快。不过建议使用-O2选项,因为它在优化长度、编译时见和代码大小之间取得了一个比较理想的平衡点。

6)加速

在将源代码变成可执行文件的过程中,需要经过许多中间步骤,包含预处理、编译、汇编、连接。这些过程实际上是有不同的程序负责完成的。这样左右一个很明显的缺点,就是gcc在处理每一个源程序时,最终都需要生成好几个临时文件才能完成相应的工作,从而无形中导致处理速度变慢。解决办法是使用Linux提供的一种更加高效的通信方式——管道。它可以用来同时连接两个程序,其中一个程序的输出将直接作为另一个程序的输入,这样就可以避免使用临时文件,但编译时却需要消耗更多的内存。编译过程中使用管道是由gcc的-pipe选项决定的。如:lammy@lammy-desktop:~$ gcc -pipe lammy.c -o lammy

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

412

主题

412

帖子

0

粉丝
肺火吃什么中成药 青椒是什么意思 哥哥的老婆叫什么 红楼梦是一部什么小说 肌酸激酶偏低是什么原因
什么图强 省公安厅厅长什么级别 菠萝和凤梨有什么区别 地中海贫血有什么影响 菊花茶泡了为什么会变绿
摆摊卖什么好 墨西哥用什么货币 为什么会骨盆前倾 三和大神什么意思 经常便秘是什么原因
论坛是什么 舌头边缘有齿痕是什么原因 痢疾是什么原因引起的 多囊什么意思 额头长痘是什么原因引起的
晚饭吃什么wmyky.com 胎盘可以治什么病hcv8jop2ns3r.cn 甲亢的早期症状是什么hcv9jop8ns0r.cn 口腔痛什么原因hcv8jop7ns6r.cn 怀孕时间从什么时候开始算helloaicloud.com
色弱和色盲有什么区别hcv9jop2ns3r.cn innisfree是什么牌子的化妆品hcv8jop6ns8r.cn 验血能查出什么病wmyky.com phe是什么氨基酸hcv8jop6ns2r.cn 烧心是什么症状hcv7jop6ns1r.cn
三伏贴能治什么病hcv9jop0ns8r.cn 12月是什么月onlinewuye.com 尿酸高不能吃什么东西hcv8jop9ns2r.cn 什么叫口腔溃疡520myf.com 深喉是什么感觉hcv8jop2ns1r.cn
3月26号是什么星座hcv9jop3ns1r.cn 乙肝不能吃什么东西hcv9jop0ns4r.cn 嗓子嘶哑吃什么药yanzhenzixun.com 王景读什么0297y7.com 白果是什么东西hcv7jop9ns9r.cn
百度