gcc编译器使用简明指南
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
gcc编译器使用简明指南
gcc对文件的处理需要经过预处理->编译->汇编->链接的步骤,从而产生一个可执行文件,各部分对应不同的文件类型,具体如下:
file.c c程序源文件
file.i c程序预处理后文件
file.cxx c++程序源文件,也可以是 / file.cpp / file.c++
file.ii c++程序预处理后文件
file.h c/c++头文件
file.s 汇编程序文件
file.o 目标代码文件
gcc [选项]文件列表
-ansi 强制完全ANSI一致
-c 仅编译或汇编,生成目标代码文件,将.c、.i、.s等文件生成.o文件,其余文件被忽略
-S 仅编译,不进行汇编和链接,将.c、.i等文件生成.s文件,其余文件被忽略
-E 仅预处理,并发送预处理后的.i文件到标准输出,其余文件被忽略
-o file 创建可执行文件并保存在file中,而不是默认文件a.out
-g 产生用于调试和排错的扩展符号表,用于GDB调试,切记-g和-O通常不能一起使用
-w 取消所有警告
-W 给出更详细的警告
-O [num]优化,可以指定0-3作为优化级别,级别0表示没有优化
-x language 默认为-x none,即依靠后缀名确定文件类型,加上-x lan确定后面所有文件类型,直到下一个-x出现为止
-D macro[=]类似于源程序里的#define,在-D macro中的macro可被源程序识别,例如gcc -D NUM -D FILE=\"bbs.txt\" hello.c -o hello,第一个-D选项定义宏NUM,在程序中可以使用#ifdef来检查是否被设置,第二个-D定义宏FILE,在源程序中可用
-U macro 类似于源程序开头定义#undef macro,也就是取消源程序中的某个宏定义
-I dir 将dir目录加到搜寻头文件的目录中去,并优先于gcc中缺省的搜索目录,有多个-I选项时,按照出现顺序搜索
-L dir 将dir目录加到搜索-lname选项指定的函数库文件的目录列表中去,并优先于g cc缺省的搜索目录,有多个-L选项时,按照出现顺序搜索
-lname 在链接时使用函数库libname.a,链接程序在-L dir指定的目录和/lib、/usr/li b目录下寻找该库文件,在没有使用-static选项时,如果发现共享函数库libname.so,则使用libname.so进行动态链接
-fPIC 产生位置无关的目标代码,可用于构造共享函数库
-static 禁止与共享函数库链接
-shared 尽量与共享函数库链接(默认)
1.编译单个文件
vi hello.c //创建源文件hello.c
gcc -o hello hello.c //编译为可执行文件hello,在默认情况下产生的可执行文件名为a.out ./hello //执行文件,如果只写hello是错误的,因为系统会将hello当指令来执行,然后报错
2.编译多个源文件
vi message.c
gcc -c message.c //输出message.o文件,是一个已编译的目标代码文件
vi main.c
gcc -c main.c //输出main.o文件
gcc -o all main.o message.o //执行连接阶段的工作,然后生成all可执行文件
./all
注意:gcc对如何将多个源文件编译成一个可执行文件有内置的规则,所以前面的多个单独步骤可以简化为一个命令。
vi message.c
vi main.c
gcc -o all message.c main.c
./all
3.使用外部函数库
GCC常常与包含标准例程的外部软件库结合使用,几乎每一个linux应用程序都依赖于GNU C 函数库GLIBC。
vi trig.c
gcc -o trig -lm trig.c
GCC的-lm选项,告诉GCC查看系统提供的数学库libm。函数库一般会位于目录/lib或者/usr/lib中。
4.共享函数库和静态函数库
静态函数库:每次当应用程序和静态连接的函数库一起编译时,任何引用的库函数的代码都会被直接包含进最终二进制程序。
共享函数库:包含每个库函数的单一全局版本,它在所有应用程序之间共享。
vi message.c
vi hello.c
gcc -c hello.c
gcc -fPIC -c message.c
gcc -shared -o libmessge.so message.o
其中,PIC命令行标记告诉GCC产生的代码不要包含对函数和变量具体内存位置的引用,这是因为现在还无法知道使用该消息代码的应用程序会将它链接到哪一段地址空间。这样编译输出的文件message.o可以被用于建立共享函数库。-shared标记将某目标代码文件变换成共享函数库文件。
gcc -o all -lmessage -L. hello.o
-lmessage标记来告诉GCC在连接阶段使用共享数据库libmessage.so,-L.标记告诉GCC 函数库可能在当前目录中,首先查找当前目录,否则GCC连接器只会查找系统函数库目录,在本例情况下,就找不到可用的函数库了。