软件开发工具GCC
重点掌握以下知识点:
了解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的更多相关文章
- PSP个人软件开发工具需求分析文档
第一部分:前景与范围 1.业务需求 1.1 背景 在目前的软件项目开发过程中,进度计划总是非常不准确,经常出现延期,而且大多数都无法给出一个相对比较准确的延迟时间.即使使用用例包.用例的方式组织需求, ...
- PSP个人软件开发工具
(您的阅读是我的荣幸,如有不满之处请留言指正!) 尚未完善.....工作中 为开发人员提供一个PSP工具,简化时间记录工作:同时提供数据使用的工具,帮助开发人提高估算能力. PSP个人软件开发工具 ...
- 你不得不用的MAC软件开发工具软件,个个万里挑一
作为软件行业,尤其是程序员,Mac上都不得不安装一些必备的MAC软件开发工具软件,下面给大家分享一些必装的MAC软件开发工具软件,以备日后之需,有备无患. 其中,包含各种语言的主流 IDE.开发辅助. ...
- ThoughtWorks、Teambition、Trello、Slack、DevCloud 主流敏捷软件开发工具平台比较
在大公司做了6年程序员,2年项目经理的小王,正在创业公司迎来他焦虑的而立之年. 但是对于3个月前加入创业公司的决定,他现在有些烦躁和怀疑人生.在他过往的经验看来,公司新接的小项目,在过去的大公司里1个 ...
- 软件开发工具——Make
掌握Makefile的使用方法和工作流程: 掌握make工具变量的相关知识,包括其引用.定义及分类等: 掌握Makefile常见的函数含义: 掌握Makefile与shell命令行的通信方法: 掌握M ...
- 全新的跨平台app软件开发工具——Lae软件开发平台
Lae是一款运行于windows的界面开发工具,具有所见即所得.开发跨平台.UI布局自由.机制简单.维护容易等诸多优点,可以开发同时运行在windows.Linux.MacOX.iOS.Android ...
- 【转】软件开发工具介绍之 6.Web开发工具
[本文转自http://www.cnblogs.com/dusonchen/archive/2011/02/09/1739087.html ] 1.EditPlus 无论是编写xhtml页面,还是cs ...
- iOS平台软件开发工具(一)-新建的工程使用CocoaPods工具集成第三方框架
CocoaPods是一款集合了上千个第三方开源库的开发工具,能够大幅度的提升团队项目的开发效率,降低时间成本. 那么就看一下CocoaPods这个工具在项目中的使用体现吧. 我们马上用ASIHTTPR ...
- 软件-开发工具:Gradle
ylbtech-软件-开发工具:Gradle Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具.它使用一种基于Groovy的特定领域语言(DSL)来声明 ...
随机推荐
- socketserver用法列子
socketserver socketserver内部使用IO多路复用以及“多线程”和“多进程”,从而实现并发处理多个客户端请求的scoket服务端.即,每个客户端请求连接到服务器时,socket服务 ...
- HDU 3339 In Action【最短路+01背包】
题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=3339] In Action Time Limit: 2000/1000 MS (Java/Other ...
- WPF常用控件样式( 内含一简单插件式开发示例)
最近离职,离职前面的一份外派然后又外包的工作,总觉得不妥,之后外派的办个入职手续都一再失约,干脆推了.恰逢清明时节,暴雨纷纷,于是打算先休息休息调整下状态,工作的事情还是谨慎点的好,免得影响心情.话说 ...
- BZOJ1064 NOI2008假面舞会
挺神的这题,发现只有环和链两种情况 搜索时我们只考虑环的,因为链可以看成找不到分类的环. 当成链时大小是的最大值是各链长的和,最小值是3 当成环时最大值是各环长的gcd,最小值是大于3的最小的ans的 ...
- BZOJ 1497 JZYZOJ 1344 [NOI2006]最大获利 网络流 最大权闭合图
http://www.lydsy.com/JudgeOnline/problem.php?id=1497 http://172.20.6.3/Problem_Show.asp?id=1344 思路 ...
- springmvc+hibernate4事务管理配置
1.事务的特性 事务的四种特性: 原子性:体现一个事务的操作的不可分割,要么权执行,要么全不执行. 一致性:事务的执行结果必须从一种一致性状态变到另一种一致性状态.最典型的就是转账,两个账户A.B总金 ...
- SqlServer Base64解码中文
最近在做一个和拥有TurboCRM相关的项目,其中需要取出客户信息的联系人字段,经过查看,这个字段在存入时用Base64加密过了 这个功能在应用层实现是很方便的,但是由于一些特殊原因,只能放到SqlS ...
- Gridview数据导出excel时身份证号码为科学计数法的解决方法
if (e.Row.RowType == DataControlRowType.DataRow) { string id = this.GridView1.DataKeys[e.Row.RowInde ...
- linuxmint - setup - 搜狗输入法
安装好linuxmint18后,官网下载搜狗输入法安装包安装.安装成功后,发现缺失部分界面,包括输入候选框,软件设置,fcitx设置都不太正常. 解决: 安装:fcitx-ui-classic 另: ...
- 使用Win2D在UWP程序中2D绘图(二)
绘制API 首先还是看一下前文的的示例: args.DrawingSession.DrawEllipse(155, 115, 80, 30, Colors.Black, 3); args.Dra ...