软件开发工具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)来声明 ...
随机推荐
- Redis学习篇(七)之事务
Redis中的事务 开启事务 MULTI:开启事务,事务块中多条语句会按照顺序放入队列当中,最后由EXEC来执行 MULTI INCT counter1 INCR counter2 INCR coun ...
- 51nod1819 黑白树V2
简单的题面 给定一棵以1为根的有根树,点可能是黑色或白色,操作如下. 1. 选定一个点x,将x的子树中所有到x的距离为奇数的点的颜色反转.2. 选定一个点x,将点x的颜色反转.3. 选定一个点x,询问 ...
- NOIP200606金明的预算方案
试题描述: 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”. ...
- keras入门--Mnist手写体识别
介绍如何使用keras搭建一个多层感知机实现手写体识别及搭建一个神经网络最小的必备知识 import keras # 导入keras dir(keras) # 查看keras常用的模块 ['Input ...
- mysql事件的开启和调用
检测事件是否开启 show variables like 'event_scheduler'; 开启事件 set global event_scheduler = on; 创建一个存储过程 delim ...
- keystone 命令简要说明
catalog: keystone catalog 可以显示所有已有的service keystone catalog --service service-type 显示某个service信息 end ...
- LWIP轻量级TCPIP协议栈的移植
http://blog.csdn.net/ygrx/article/details/8020516 好久没有做过技术工作了,前几天因为一些需要,要在ST的OS20平台上进行了LWIP的移植,有一些心得 ...
- 多线程间通信之AutoResetEvent和ManualResetEvent的原理分析和开发示例
AutoResetEvent 允许线程通过发信号互相通信. 通常,当线程需要独占访问资源时使用该类. 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号. 如果 AutoRe ...
- Androidclient与服务端交互之登陆演示样例
今天了解了一下androidclient与服务端是如何交互的,发现事实上跟web有点类似吧,然后网上找了大神的登陆演示样例.是基于IntentService的 1.后台使用简单的servlet,支持G ...
- Lua中的元表和元方法
Lua中每个值都可具有元表. 元表是普通的Lua表,定义了原始值在某些特定操作下的行为.你可通过在值的原表中设置特定的字段来改变作用于该值的操作的某些行为特征.例如,当数字值作为加法的操作数时,Lua ...