剑,是一种武器,古龙先生很喜欢论剑,对剑也有不一样的理解;对于剑,使用它的是剑客,而如果要升级则是人的升级,从而推动剑术的提高与用剑的境界的提升。

好的剑都是铸剑师倾入自己的心血浇灌而成的;而对于剑客,要想能够使用它,不仅仅是挥动它,而是用能够与之沟通,能够“心灵相通”,不断地与之磨合,达到收发自如的境界。

编译器就是程序员的“剑”,而且GCC就是“剑中利器”;但是它对于所有人都是一样的,其关键在于使用它的人,如何去“磨”,如何去“练”,“磨”出自己的“形状”,“练”出自己的感觉,让自己得心应手的去使用它。

一)gcc的基本介绍,详细的使用情况,请查看附件或者gcc的官网手册——https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/

gcc 是GNU Compiler Collection的缩写,即GNU编译器工具集。在c语言的编译流程中主要扮演两个角色预处理器与编译器,另外,它也能够调用了binutils中的汇编器(as)与链接器(ld)生成对应的elf文件。它主要支持编译的语言有:c/c++/java/object-c/object-c++/fortran/ada.

gcc作为一个编译器,为了能够更好的整理各种工具,它被设计为一个由specs文件驱动的程序。specs文件描述了gcc的所有行为。默认的spec文件可以用”gcc -dumpspecs”,详细描述见https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Spec-Files.html#Spec-Files。通过spec文件可以理解gcc的执行流程与相关参数的设置,通过修改它可以配置它的执行流程。当然也可以定制spec文件,通过gcc -specs=<file>实现。

为什么要学习与熟悉gcc呢?不仅仅是因为它是完备的编译器,更因为GNU开源的强大力量,已经将它推广到各种处理器构架与各种应用平台。但是因为它的适用性很广,从而导致了它很多的命令项,让人头晕目眩,但是常用的确只有一些,被反复使用,值得总结一下。

gcc被编译出来,主要的可执行文件(LFS7.6:6.17.2):

c++/g++:c++编译器

gcc/cc:c编译器

cpp:c语言预处理器

gcov:程序覆盖测试工具,用于统计程序运行代码执行的频率,从而为程序优化做参考

二)gcc的基本用法

1.演绎c语言编译的流程(以hello.c为例):

a)预处理:gcc -E hello.c,将c语言定义的宏展开,输出到终端界面

b)编译:gcc -S hello.c,解析c语言语法生成对应的汇编语言(AT&T语法)文件,即hello.s

c)汇编:gcc -c hello.s ,调用as将编译生成的hello.s生成模板文件(elf文件),即hello.o

d)链接:gcc -o hello hello.o,调用ld将生成的hello.o链接成可执行文件,即hello

2.编译c语言源码的主要命令行参数:

在编译c语言过程中,需要注意两个方面:其一为头文件(*.h)的寻找,其二为函数库的链接。c语言中头文件的使用是一般是用相对路径,”#include <*.h>”指定包含的文件内容,但是从哪个路径下去寻找对应的头文件。需要用”-I path”的参数来指定对应的路径。当在链接时,如果碰到如下出错,“hello.c:(.text+0xf): undefined reference to `add'”表示无法找到对应的符号引用,则为链接出错。解决这样的问题是用“-L path”指定链接库的路径,“-l so-name”指定链接库的名(比如:libcurl.so,名称为curl)。

如上所诉,gcc指定编译路径与链接库的方式为:

gcc -I inc-path -L lib-path -l lib-name.

C语言中使用宏来帮助程序编写,为了提高程序兼容性,在许多软件项目用宏来分隔不同平台与使用环境的代码,从而当在实际编译过程中指定相应的宏来控制程序的编译过程。可以用“-D MACRONAME=VALUE”来将MACRONAME传递给程序,编译。

将调试信息添加到elf文件中,方便程序调试,建议是每次编译都把它打开,方便程序调试.用参数“-g”来指定。

优化程序指令“-O 2”,指定编译时的优化等级。

为了提前发现各种语法错误与逻辑错误,可以将“- Wall”所有的警告信息打印出来,然后对代码进行优化与纠正。

链接所有的目标文件,生成动态链接库:gcc -shared -fPIC -o lib$fn.so $fn.c

3.gcc的默认路径与行为:

a)如何获取gcc的默认链接路径与头文件路径(LFS7.6:5.4):

(1)编译测试的c语言源代码:echo 'main(){}' > dummy.c

(2)获取编译信息:gcc dummy.c -v -Wl,--verbose &> dummy.log

   (3)查询默认头文件路径:grep -B4 '^ /usr/include' dummy.log

   (4)查询默认的链接路径:grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

   (5)查询标准c的库路径(glibc):grep "/lib.*/libc.so.6 " dummy.log

   (6)获取默认链接库的路径的方法:gcc -print-search-dirs |sed -n '/libraries:/p'

    b)影响gcc行为的环境变量,格式跟PATH一样用”:”分割:

CPATH/C_INCLUDE_PATH:增加头文件搜索路径

LIBRARY_PATH:增加链接库的搜索路径

4.交叉编译工具,主要有三部分(binutils/gcc/glibc)介绍:

在开发主机上生成目标主机的编译工具,比如:在x86开发平台上生成arm板上运行的gcc——arm-none-linux-gnueabi-gcc;在gcc之前添加交叉编译前缀。对于交叉编译工具,形式上在编译器工具集之前添加了交叉编译前缀,使用方式和gcc是一致的,只是有一些针对目标机器的特定参数,实际效果是生成了能够在目标主机上运行的可执行文件,可以通过binutils进行分析。获取交叉编译工具的方法有三种:1.到网上下载现成的工具集;2,自己一步一步编译;3.用现成的编译脚本一次编译。

三)Makefile的基本介绍,详细见附件makefile文档

软件工程都是由很多模块化的源文件构成,当软件规模不断扩大,同时软件bug不断修改,也是为了简化与减少重复的软件劳动,需要有序地将所有软件源文件管理起来,从而诞生了Makefile。

了解Makefile对理解程序如何生成的与软件模块的构成有很大的帮助,而且往往一开始接触软件项目时,都有一套软件系统或者由自己构建软件系统,此时makefile就是第一个需要去熟悉的步骤。

首先makefile被make命令给读取,然后执行;make命令的常用参数:

基本格式:make [选项] [目标](如果目标不为空,则去执行makefile定义的目标)

-j N :同时允许 N 个任务;可以加快make的执行。

-C dir:进入dir目录,执行make命令

Makefile的基本书写格式:

目标:依赖

[Tab]命令

所有的makefile可以看作是定义的目标的集合。

当系统越来越复杂时,构建makefile也是很复杂的事,同时也考虑到软件系统编译时,也依赖于系统编译环境,所以就有了自动构建makefile的相关工具与命令:gnu发布软件的autotools(通过configure配置来生成相关的makefile),cmake来自动构建makefile,qt编译时使用的qmake等。在Android系统开发构成也引入了Android.mk与mm命令来编译系统。

宝剑锋从磨砺出——编译器gcc的使用相关推荐

  1. 宝剑锋从磨砺出,梅花香自苦寒来

    转眼间,来兄弟连快有二十天了,在这二十天内有痛苦也有欢乐,但大部分时间是在拼命地敲代码的过程中忘记了痛苦和欢乐.每天作业量很大,事儿也比较多(因为我是组长),但不能因为这个耽误自己的学习,也不能因为这 ...

  2. 刘一男词汇课(从aboard到establish):“宝剑锋从磨砺出,梅花香自苦寒来。“

    "宝剑锋从磨砺出,梅花香自苦寒来."  单词解析  oar n.桨:船桨 board n.板:委员会:膳食:(尤指)木板 boat n.小船:舟:汽艇:(泛指)船 d >&g ...

  3. nutch学习、、孤剑之家 宝剑锋从磨砺出,梅花香自苦寒来。我欲仗剑走天涯。 博客园 首页 新随笔 联系 订阅订阅 管理 随笔 - 771 文章 - 8 评论 - 13

    孤剑之家 宝剑锋从磨砺出,梅花香自苦寒来.我欲仗剑Nutch 2.2+MySQL+Solr4.2实现网站内容的抓取和索引 原文地址: http://blog.sina.com.cn/s/blog_3c ...

  4. 【济南校区】宝剑锋从磨砺出

    public class  宝剑锋从磨砺出{     private 同学;     private 老师;     private 黑马; public static void main(Strin ...

  5. 上海创蓝253董事长_宝剑锋从磨砺出,创蓝253召开第四季度誓师大会

    2018 年 10 月 13 日,创蓝 253 业务中心全体成员齐聚一堂,举办第三季度表彰大会暨第四季度誓师大会.大会的主题一是表彰业务中心第三季度优秀员工与优秀团队;二是制定第四季度目标,为冲刺全年 ...

  6. 宝剑锋从磨砺出——使用在线评测平台磨砺C#使用能力

    学数学的时候,我们通常会通过大量的练习题来巩固所学知识:其实学习程序设计设计语言也不例外.那么如何通过练习去磨砺自己的C#使用能力呢?一个方法是参与到实际的软件项目开发中,而另一个更加直接的方法则是& ...

  7. 宝剑锋从磨砺出 梅花香自苦寒来

    梯子的梯阶从来不是用来搁脚的,它只是让人们的脚放上一段时间, 以便让别一只脚能够再往上登. 只有登上山顶,才能看到那边的风光. 只有创造,才是真正的享受,只有拚搏,才是充实的生活. 崇高的理想就象生长 ...

  8. 宝剑锋从磨砺出,梅花开自苦寒来。今天那些在考研场上奋战的都是样的!

    2015的考研在今天拉开帷幕!那些每天天不亮就起床占座,深夜一个人走回宿舍的日子,就这么不知不觉地撑过来了.每一滴汗水都不会白流,每一个梦想都值得尊重.成败不算什么,重要的是这份追逐梦想的过程!我们还 ...

  9. Linux编译器GCC的使用

    嵌入式Linux编译器GCC的使用 1.GCC概述 作为自由软件的旗舰项目,Richard Stallman在十多年前刚开始写作GCC的时候,还只是仅仅把它当作一个C程序语言的编译器,GCC的意思也只 ...

最新文章

  1. 程序员会懂的冷笑话:各大编程语言的内心独白
  2. 如何才能使用内存小或者显存小的设备训练神经网络
  3. 泛型算法----概述,初识泛型算法,定制操作
  4. 2015年秋季个人阅读计划
  5. leetcode 368. Largest Divisible Subset | 368. 最大整除子集(动态规划详解)
  6. Django的简单介绍及虚拟环境的搭建、创建项目,数据库(Windows版超级详细)--Python web应用程序开发(Python实战)
  7. Android Picasso最详细的使用指南
  8. java 访问网络驱动器_尝试通过GitLab Runner脚本访问网络驱动器但收到错误
  9. Python demjson 下载并安装
  10. html怎么把view变成标签_html单选按钮默认选中怎么做?input标签的单选按钮用法实例...
  11. 二手青春——代码之路1
  12. 常见计算机密码破解实用手册
  13. 后端开发之如何写接口设计文档
  14. Vin码车架号识别技术已经很成熟了
  15. arduino继电器控制风扇_Arduino 笔记 - Lab21 使用继电器控制12V风扇
  16. 威联通文件传输服务器,QNAP NAS方案-------文件共享
  17. 光驱读盘能力差的解决方法
  18. 免费微信批量公众号采集文章方法
  19. 【硬见小百科】一些硬件电路技术经验整理
  20. 微信服务器保留几年记录_微信聊天语音记录会在腾讯服务器保存多久?

热门文章

  1. 虞美人【黑夜流萤】黄昏把酒上阁楼,月下多少幽梦,锁心头。
  2. 6-14 时间类 - 14. 完善时、分、秒的设置
  3. 礼物精选 个性化礼品推荐平台
  4. AcWing 168 生日蛋糕【DFS 剪枝 ☆】
  5. Freelancer自由工作离我们还有多远?
  6. map职业性格测验 软件开发还是软件测试,MAP职业性格测验.PDF
  7. Dgraph安装和使用(一)
  8. 世界上最大的监狱是人的大脑
  9. 【第170期】给@Steve的简历分析:不自卑,但我确实在仰望
  10. 绿茶的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告