




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
GCC 支持了许多不同的语言,包括 C、C+、Ada、Fortran、Objective C,Perl、Python 和 Ruby,甚至还有Java。Linux 内核和许多其他自由软件以及开放源码应用程序都是用 C 语言编写并使用 GCC 编译的。编译C+程序:-c 只编译不连接g+ file1 -c -o file1.og+ file2 -c -o file2.og+ file1.o file.o -o execg+ -c a.cpp 编译g+ -o a a.o 生成可执行文件也可以 g+ -o a a.cpp直接生成可执行文件。1. 编译单个源文件为了进行测试,你可以创建“Hello World”程序:#include #include int main(int argc, char *argv)printf(“Hello world!n”);exit(0);使用如下命令编译并测试这个代码:# gcc -o hello hello.c# ./helloHello wordl!在默认情况下产生的可执行程序名为a.out,但你通常可以通过 gcc 的“-o”选项来指定自己的可执行程序名称。2. 编译多个源文件源文件message.c包含一个简单的消息打印函数:#include void goodbye_world(void)printf(“Goodbye, world!n”);使用gcc的“-c”标记来编译支持库代码:# gcc -c message.c这一过程的输出结果是一个名为message.o的文件,它包含适合连接到一个较大程序的已编译目标代码。创建一个简单的示例程序,它包含一个调用goodbye_world的main函数#include void goodbye_world(void):int main(int argc, char *argv)goodbye_world();exit(0);使用GCC编译这个程序:# gcc -c main.c现在有了两个目标文件: message.o 和 main.o 。它们包含能够被 Linux 执行的目标代码。要从这个目标代码创建Linux可执行程序,需要再一次调用 GCC 来执行连接阶段的工作:# gcc -o goodbye message.o main.o运行编译结果:# ./goodbyeGoodbye, world!前面这些单独的步骤也可以简化为一个命令,这是因为 GCC 对如何将多个源文件编译为一个可执行程序有内置的规则。# gcc -o goodbye message.c main.c# ./goodbyeGoodbye, world!3. 使用外部函数库GCC 常常与包含标准例程的外部软件库结合使用,几乎每一个 Linux 应用程序都依赖于由 GNU C 函数库 GLIBC。应用外部函数库的例子:#include #include #include #define MAX_INPUT 25int main(int agrc, char *argv)char inputMAX_INPUT;double angle;printf(“Give me an angle (in radians) =”);if(!fgets(input, MAX_INPUT, stdin)perror(“an error occurred.n”);angle = strtod(input, NULL);printf(“sin(%e) = %en”, angle, sin(angle);return 0;编译命令:# gcc -o trig -lm trig.cGCC 的”-lm”选项,它告诉 GCC 查看系统提供的数学库(libm)。因为Linux和UNIX的系统函数库通常以”lib”为前缀,所以我们假设它存在。真正的函数库位置随系统的不同而不同,但它一般会位于目录/lib或/usr/lib中,在这些目录中还有数以百计的其他必需的系统函数库。4. 共享函数库与静态函数库Linux系统上的函数库分为两种不同的类型:共享的和静态的静态函数库:每次当应用程序和静态连接的函数库一起编译时,任何引用的库函数中的代码都会被直接包含进最终的二进制程序。共享函数库:包含每个库函数的单一全局版本,它在所有应用程序之间共享。这一过程背后所涉及的机制相当复杂,但主要依靠的是现代计算机的虚拟内存能力,它允许包含库函数的物理内存安全地在多个独立用户程序之间共享。使用共享函数库不仅减少了文件的容量和 Linux 应用程序在内存中覆盖的区域,而且它还提高了系统的安全性。一个被许多不同程序同时调用的共享函数库很可能会驻留在内存中,以在需要使用它时被立即使用,而不是位于磁盘的交换分区中。这有助于进一步减少一些大型 Linux 应用程序的装载时间。将上面的 message.c 作为共享库函数使用的例子:# gcc -fPIC -c message.c“PIC”命令行标记告诉 GCC 产生的代码不要包含对函数和变量具体内存位置的引用,这是因为现在还无法知道使用该消息代码的应用程序会将它连接到哪一段内存地址空间。这样编译输出的文件 message.o 可以被用于建立共享函数库,我们只需使用gcc的“-shared”标记即可:# gcc -shared -o libmessage.so message.o将上面的mian.c使用共享库函数ligmessage.so编译:# gcc -o goodbye -lmessage -L. message.o“-lmessage”标记来告诉 GCC 在连接阶段引用共享函数库 libmessage.so 。“-L.”标记告诉 GCC 函数库可能位于当前目录中,否则 GNU 的连接器会查找标准系统函数库目录,在本例的情况下,就找不到可用的函数库了。此时运行编译好的goodbye会提示找不到共享函数库:#./goodbye./goodbye: error while loading shared libraries: libmessage.so: cannot open shared object file: No such file or directory可以使用命令 ldd 来发现一个特定应用程序需要使用的函数库。ldd搜索标准系统函数库路径并显示一个特定程序使用的函数库版本。#ldd goodbyelinux-gate.so.1 = (000493000)libmessage.so = not foundlibc.so.6 = /lib/libc.so.6 (00097c000)/lib/ld-linux.so.2 (00095a000)库文件 libmessage.so 不能在任何一个标准搜索路径中找到,而且系统提供的配置文件 /etc/ld.so.conf 也没有包含一个额外的条目来指定包含该库文件的目录。需要设置一个环境变量LD_LIBRARY_PATH来制定额外的共享函数库搜索路径,# export LD_LIBRARY_PATH=pwd# ldd goodbyelinux-gate.so.1 = (0x002ce000)libmessage.so = /tmp/cpro/libmessage.so (0x00b0f000)libc.so.6 = /lib/libc.so.6 (0x0097c000)/lib/ld-linux.so.2 (0x0095a000)运行程序# ./goodbyeGoodbye, world!gcc在命令行上经常使用的几个选项是:-c 只预处理、编译和汇编源程序,不进行连接。编译器对每一个源程序产生一个目标文件。-o file 确定输出文件为file。如果没有用-o选项,缺省的可执行文件的输出是 a.out,目标文件和汇编文件的输出对source.suffix分别是source.o和source.s,预处理的C源程序的输出是标准输出stdout。-Dmacro或-Dmacro=defn 其作用类似于源程序里的#define。例如:% gcc -c -DHAVE_GDBM -DHELP_FILE=”help” cdict.c其中第一个- D选项定义宏HAVE_GDBM,在程序里可以用#ifdef去检查它是否被设置。第二个-D选项将宏HELP_FILE定义为字符串“help”(由于反斜线的作用,引号实际上已成为该宏定义的一部分),这对于控制程序打开哪个文件是很有用的。-Umacro 某些宏是被编译程序自动定义的。这些宏通常可以指定在其中进行编译的计算机系统类型的符号,用户可以在编译某程序时加上 -v选项以查看gcc缺省定义了哪些宏。如果用户想取消其中某个宏定义,用-Umacro选项,这相当于把#undef macro放在要编译的源文件的开头。-Idir 将dir目录加到搜寻头文件的目录列表中去,并优先于在gcc缺省的搜索目录。在有多个-I选项的情况下,按命令行上-I选项的前后顺序搜索。dir可使用相对路径,如-I./inc等。-O 对程序编译进行优化,编译程序试图减少被编译程序的长度和执行时间,但其编译速度比不做优化慢,而且要求较多的内存。-O2 允许比-O更好的优化,编译速度较慢,但结果程序的执行速度较快。-g 产生一张用于调试和排错的扩展符号表。-g选项使程序可以用GNU的调试程序GDB进行调试。优化和调试通常不兼容,同时使用-g和-O(-O2)选项经常会使程序产生奇怪的运行结果。所以不要同时使用-g和-O(-O2)选项。-fpic或-fPIC 产生位置无关的目标代码,可用于构造共享函数库。以上是gcc的编译选项。gcc的命令行上还可以使用连接选项。事实上,gcc将所有不能识别的选项传递给连接程序ld。连接程序ld将几个目标文件和库程序组合成一个可执行文件,它要解决对外部变量、外部过程、库程序等的引用。但我们永远不必要显式地调用ld。利用gcc命令去连接各个文件是很简单的,即使在命令行里没有列出库程序,gcc也能保证某些库程序以正确的次序出现。gcc的常用连接选项有下列几个:-Ldir 将dir目录加到搜寻-l选项指定的函数库文件的目录列表中去,并优先于gcc缺省的搜索目录。在有多个-L选项的情况下,按命令行上-L选项的前后顺序搜索。dir可使用相对路径。如-L./lib等。-lname 在连接时使用函数库
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东健身教练知识培训课件
- 2025年分散型控制系统(DCS)项目提案报告
- 数字化产品应用项目市场推广策划委托协议
- 专业咨询合伙人协议
- 2024年山东公务员真题
- 2024年进贤县选调教师真题
- 屏蔽门工作原理课件
- 合作协议签署流程
- 森林防火系统应急响应预案(3篇)
- 地下给排水施工方案(3篇)
- 2025年发展对象考试题库附含答案
- 2025年兵团基层两委正职定向考录公务员试题(附答案)
- 2025年新专长针灸考试题及答案
- 高三生物一轮复习课件微专题5电子传递链化学渗透假说及逆境胁迫
- DBJ50-T-306-2024 建设工程档案编制验收标准
- 2025四川雅安荥经县国润排水有限责任公司招聘5人笔试历年参考题库附带答案详解
- 2025中国银行新疆区分行社会招聘笔试备考试题及答案解析
- 污水采样培训课件
- 药品医疗器械试题及答案
- 子宫内膜类器官构建与临床转化专家共识解读 2
- 幼师培训:如何上好一节课
评论
0/150
提交评论