重点掌握以下知识点:

  了解gcc编译器的下载和安装方法,包括嵌入式交叉编译平台搭建的方法

  重点掌握gcc的基本编译流程和编译方法

  重点掌握gcc编译的高级操作及选项

  了解gcc编译器性能分析工具,包括gprof和gcov

gcc下载地址:ftp://ftp.gnu.org/gnu/gcc/

安装过程中遇到的问题:

  #./configure  --help  查看可用的参数

  一般来说configure较重要的就是那个--prefix=/path了,--prefix后面接的路径表示这个软件将来要安装到那个目录去,如果你没有指定--prefix=/path这个参数,通常默认参数就是/usr/local。至于其他参数的意义可以参考./configure  --help的结果。

  参考《Linux常用工具入门到精通》编译器配置如下:

  #./configure  --prefix=/usr/local/gcc-3.4.0  --enable-shared  --host=i386-redhat-Linux  --mandir=/usr/share/man  --enable-threads=posix

--disable-checking  --with-system-zlib  --enable-languages=c,c++,java

  结果出现了如下错误:

  checking build system type... Invalid configuration `i386-redhat-Linux': system `Linux' not recognized
  configure: error: /bin/sh ../../gcc-3.4.0/gcc/../config.sub i386-redhat-Linux failed
  make: *** [configure-gcc] 错误 1

  很明显可以看出是--host=i386-redhat-Linux配置项有问题,但是该如何配置呢?

  首先我用#uname -r查看了相关信息:Linux localhost.localdomain 2.6.18-53.el5 #1 SMP Wed Oct 10 16:34:02 EDT 2007 i686 athlon i386 GNU/Linux,但是还是不知道--host=???最终我的解决方法是直接用#.configure不加任何选项运行一下,会得到一个Makefile文件,打开该文件可以发现host=i686-redhat-linux-gnu,按照改行重新运行上面的配置命令,成功了。

  如果用户在以前就安装了其他版本的GCC,为了两个版本同时使用,用户可以对新安装的版本做一个简单的链接:

  #cd  /usr/bin

  #ln  -s  /usr/local/gcc-3.4.0/bin/gcc  gcc3.4

  这样用户就可以在一个Linux系统中使用两个版本的GCC了,只是输入gcc代表以前安装的GCC版本,输入gcc3.4代表GCC3.4.0版本。

交叉编译平台的搭建(以arm-linux-gcc-4.3.2为例):

  (1)首先从网站上下载arm-linux-gcc-4.3.2.tgz压缩包,将此压缩包复制到/tmp下,然后进入该目录执行解压命令:

    #cd  /tmp

    #tar  -xvzf  arm-linux-gcc-4.3.2.tgz  -C /

  (2)执行该命令,把arm-linux-gcc-4.3.2.tgz默认安装到/usr/local/arm/4.3.2目录,为保证每次开机arm-linux-gcc都能正常工作,在命令行输入:

    #cd  /root

    #gedit  /root/.bashrc

  (3)编辑/root/.bashrc文件,在最后一行添加export  PATH=$PATH:/usr/local/arm/4.3.2/bin,保存退出

  (4)重新登录RedHat系统,在命令行输入arm-linux-gcc  -v,验证是否已安装成功

GCC编译基础流程:

  .c(c源程序)     ---(-E)--->   .i(预处理后的c程序)

  .i(预处理后的c程序)  ---(-S)--->   .s(汇编代码)

  .s(汇编代码)    ---(-c)--->   .o(目标文件)

  .o(目标文件)    ---(链接)--->   elf(可执行文件)

  例如:实例程序为hellogcc.c

  分步进行:

  #gcc  -E  hellogcc.c  -o  hellogcc.i    预处理

  #gcc  -S  hellogcc.i   -o  hellogcc.s    编译

  #gcc  -c   hellogcc.s  -o  hellogcc.o    汇编

  #gcc  hellogcc.o  -o  hellogcc       链接

   一步到位:

  #gcc  -o  hellogcc  hellogcc.c

GCC常规选项:

  -X language 指定输入文件的语言为language

  -E      只对源文件进行预处理,不做编译、汇编及链接,GCC会忽略任何不需要预处理的输入文件

  -S        只进行编译,不做汇编及链接,对于每个输入的非汇编语言文件,输出文件都是汇编语言文件

  -c      只进行汇编,不做链接,汇编成源文件的目标文件,默认状态下生成.o文件,GCC忽略-c选项后面任何无法识别的输入文件

  -o file    把输出的文件指定到file中,该选项可以输出汇编文件、目标文件以及可执行文件

  -v      打印出编译器内部编译各个过程的命令行信息和编译器版本信息

GCC警告选项:

  -fsyntax-only 检查程序中的语法错误,但是不产生输出信息

  -w       禁止所有警告信息

  -Wunused   如果某个局部变量除了声明就没有再使用,或者声明了静态函数但是没有定义,或者某条语句的运算结果显然没有使用,编译器就发出警告

  -Wmain    如果把main函数声明或定义成奇怪的类型,编译器就发出警告

  -Werror    视警告为错误,出现任何警告即放弃编译

  -Wredundant-decls  如果在同一个可见域定义多次声明,编译器就发出警告,即使这些重复声明有效并且毫无差别

  -Wall      允许gcc提供所有有用的报警信息

  -pedantic-error 允许发出ANSI C标准所列出的全部信息

GCC调试选项:

  -g  使用-g选项可以使GCC在编译时产生调试信息,GDB能够使用这些调试信息对程序进行排错,如果要使用GDB调试信息,那么-g选项必须要选中,否则GDB将不能调试出错语句

  -pg  产生额外代码,用于输出profile信息,供分析程序gprof使用

  -gdwarflevel n  生成调试信息,同时使用level指出需要多少信息,默认的level值是2,level 1输出最少量的信息,仅包括函数和外部变量的描述,没有局部变量和行号信息。level 3包含更多的信息,如程序中出现的所有宏定义,支持宏扩展

GCC优化选项:

  -On  其中n是一个代表优化级别的整数,n的范围一般在0-3之间,n值越大,优化效果越好;-O0表示不进行任何优化;-O3表示尽可能的执行优化

  -Os  对可执行文件的大小进行优化

GCC链接选项:

  连接器的主要功能是链接多个目标文件和库文件,并最终生成特定平台的可执行文件。一般而言,标准函数库都放在/lib或者/usr/lib子目录里,默认情况下,GCC编译器只会寻找所有标准函数库目录里的文件,如果用户要链接自己编写的文件,就必须使用GCC的链接功能选项。

  -llibrary  搜索library的库文件,连接器在标准搜索目录中寻找这个库文件,库文件的真正名字是liblibrary.a,连接器会把它当作文件名准确引用这个文件。但是即使不使用这个选项,gcc也把默认的一些库连接进去(若需要引用一个不是默认的库则必须使用该链接选项,否则会出现undefined reference to这样的链接错误)。搜索目录除了一些系统标准目录外,还包括用户以-L选项指定的路径

  -nostartfiles  不连接系统标准启动文件,而标准库文件仍然正常使用

  object-file-name  如果某些文件没有特别明确的后缀,GCC就认为它们生成的是目标文件或库文件

  -nostdlib  不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器

  -static    在动态链接时,阻止链接共享库

  -shared   生成一个共享目标文件,它可以和其他目标文件连接产生可执行文件。只有部分系统支持该选项

  -I  目录   表示在头文件搜索路径中添加用户自定义的搜索目录。由于Linux中头文件都默认放到/usr/include目录下,因此,当用户希望添加其他位置的头文件时,就可以通过 -I  dir 选项指定。这个选项在编译多个不在同一个目录下的文件非常有用

  -L  目录   表示在库文件的搜索路径中添加用户自定义的搜索目录名,例如一个程序在链接时需要使用在目录/home/wth下的库,用户只需要在 gcc 命令中加入 -L  /home/wth/

软件开发工具GCC的更多相关文章

  1. PSP个人软件开发工具需求分析文档

    第一部分:前景与范围 1.业务需求 1.1 背景 在目前的软件项目开发过程中,进度计划总是非常不准确,经常出现延期,而且大多数都无法给出一个相对比较准确的延迟时间.即使使用用例包.用例的方式组织需求, ...

  2. PSP个人软件开发工具

    (您的阅读是我的荣幸,如有不满之处请留言指正!) 尚未完善.....工作中 为开发人员提供一个PSP工具,简化时间记录工作:同时提供数据使用的工具,帮助开发人提高估算能力.   PSP个人软件开发工具 ...

  3. 你不得不用的MAC软件开发工具软件,个个万里挑一

    作为软件行业,尤其是程序员,Mac上都不得不安装一些必备的MAC软件开发工具软件,下面给大家分享一些必装的MAC软件开发工具软件,以备日后之需,有备无患. 其中,包含各种语言的主流 IDE.开发辅助. ...

  4. ThoughtWorks、Teambition、Trello、Slack、DevCloud 主流敏捷软件开发工具平台比较

    在大公司做了6年程序员,2年项目经理的小王,正在创业公司迎来他焦虑的而立之年. 但是对于3个月前加入创业公司的决定,他现在有些烦躁和怀疑人生.在他过往的经验看来,公司新接的小项目,在过去的大公司里1个 ...

  5. 软件开发工具——Make

    掌握Makefile的使用方法和工作流程: 掌握make工具变量的相关知识,包括其引用.定义及分类等: 掌握Makefile常见的函数含义: 掌握Makefile与shell命令行的通信方法: 掌握M ...

  6. 全新的跨平台app软件开发工具——Lae软件开发平台

    Lae是一款运行于windows的界面开发工具,具有所见即所得.开发跨平台.UI布局自由.机制简单.维护容易等诸多优点,可以开发同时运行在windows.Linux.MacOX.iOS.Android ...

  7. 【转】软件开发工具介绍之 6.Web开发工具

    [本文转自http://www.cnblogs.com/dusonchen/archive/2011/02/09/1739087.html ] 1.EditPlus 无论是编写xhtml页面,还是cs ...

  8. iOS平台软件开发工具(一)-新建的工程使用CocoaPods工具集成第三方框架

    CocoaPods是一款集合了上千个第三方开源库的开发工具,能够大幅度的提升团队项目的开发效率,降低时间成本. 那么就看一下CocoaPods这个工具在项目中的使用体现吧. 我们马上用ASIHTTPR ...

  9. 软件-开发工具:Gradle

    ylbtech-软件-开发工具:Gradle Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具.它使用一种基于Groovy的特定领域语言(DSL)来声明 ...

随机推荐

  1. socketserver用法列子

    socketserver socketserver内部使用IO多路复用以及“多线程”和“多进程”,从而实现并发处理多个客户端请求的scoket服务端.即,每个客户端请求连接到服务器时,socket服务 ...

  2. HDU 3339 In Action【最短路+01背包】

    题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=3339] In Action Time Limit: 2000/1000 MS (Java/Other ...

  3. WPF常用控件样式( 内含一简单插件式开发示例)

    最近离职,离职前面的一份外派然后又外包的工作,总觉得不妥,之后外派的办个入职手续都一再失约,干脆推了.恰逢清明时节,暴雨纷纷,于是打算先休息休息调整下状态,工作的事情还是谨慎点的好,免得影响心情.话说 ...

  4. BZOJ1064 NOI2008假面舞会

    挺神的这题,发现只有环和链两种情况 搜索时我们只考虑环的,因为链可以看成找不到分类的环. 当成链时大小是的最大值是各链长的和,最小值是3 当成环时最大值是各环长的gcd,最小值是大于3的最小的ans的 ...

  5. BZOJ 1497 JZYZOJ 1344 [NOI2006]最大获利 网络流 最大权闭合图

    http://www.lydsy.com/JudgeOnline/problem.php?id=1497 http://172.20.6.3/Problem_Show.asp?id=1344   思路 ...

  6. springmvc+hibernate4事务管理配置

    1.事务的特性 事务的四种特性: 原子性:体现一个事务的操作的不可分割,要么权执行,要么全不执行. 一致性:事务的执行结果必须从一种一致性状态变到另一种一致性状态.最典型的就是转账,两个账户A.B总金 ...

  7. SqlServer Base64解码中文

    最近在做一个和拥有TurboCRM相关的项目,其中需要取出客户信息的联系人字段,经过查看,这个字段在存入时用Base64加密过了 这个功能在应用层实现是很方便的,但是由于一些特殊原因,只能放到SqlS ...

  8. Gridview数据导出excel时身份证号码为科学计数法的解决方法

    if (e.Row.RowType == DataControlRowType.DataRow) { string id = this.GridView1.DataKeys[e.Row.RowInde ...

  9. linuxmint - setup - 搜狗输入法

    安装好linuxmint18后,官网下载搜狗输入法安装包安装.安装成功后,发现缺失部分界面,包括输入候选框,软件设置,fcitx设置都不太正常. 解决: 安装:fcitx-ui-classic 另: ...

  10. 使用Win2D在UWP程序中2D绘图(二)

    绘制API 首先还是看一下前文的的示例: args.DrawingSession.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);    args.Dra ...