GCC编译总结

本文详细介绍了GCC编译器的各种选项,包括预处理、编译、汇编和链接的步骤,以及-E、-S、-C、-o等参数的作用。还涵盖了头文件和库的路径设置、动态库和静态库的创建和使用,以及编译优化级别如-O0、-O2、-O3等。此外,文章讨论了-g选项生成调试信息、-Wall开启警告、-Werror将警告视为错误、-ansi和-std指定语言标准等。最后,提到了针对特定CPU的优化选项,如-mtune。
摘要由CSDN通过智能技术生成

编译步骤
-E 1.预处理,生成.i的文档[预处理器cpp]
-S 2.将预处理后的文档不转换成汇编语言,生成文档.s[编译器egcs]
-C 3.有汇编变为目标代码(机器代码)生成.o的文档[汇编器as]
4.连接目标代码,生成可执行程式[链接器ld]

指定生成的目标文件名
-o 文件名

指定头文件或库文件的位置
-Idir dir为头文件位置
-Ldir dir为库文件位置
-lname 链接静态库(libname.a)或动态库(libname.so)的库文件
注:LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径
LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径

Linux运行时动态库搜索路径优先级
	1. 编译目标代码时指定的动态库搜索路径(DT_RUNPATH为空,DT_RPATH不为空)。 
		例如:gcc main.c -Wl,-rpath,库的路径
	2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径(对setuid/setgid的程序无效,并且可以被链接器选项--library-path覆盖)
	3. DT_RUNPATH指定的动态库搜索路径(-Wl,--enable-new-dtags)
	4. 配置文件/etc/ld.so.conf中指定的动态库搜索路径
	5. 默认的动态库搜索路径/lib
	6. 默认的动态库搜索路径/usr/lib

编译动态库文件 命名:lib + 库的名字 + .so
第一步:生成与位置无关的.o目标文件,需要添加-fPIC参数,该参数用于生成位置无关代码已工生成动态库使用,
使用命令:gcc -c -o test.o -fPIC test.c
  第二步:使用-shared参数生成动态库,
使用如下命令:gcc -shared -o libmyshare.so test.o,
上述两个命令可以连在一起,如下所示:gcc -shared -fPIC -o libmyshare.so test.c
动态库的使用
第一种方法:
gcc + 源文件 + -L 动态库路径 + -l动态库名 + -I头文件目录 + -o 可执行文件名
gcc main.c -L lib -l MyTest -I include -o app
./app(执行失败,找不到链接库,没有给动态链接器(ld-linux.so.2)指定好动态库 libmytest.so 的路径)

第二种方法:
    gcc + 源文件 + -I头文件 + libxxx.so + -o 可执行文件名
    gcc main.c -I include lib/libMyTest.so -o app
    (执行成功,已经指明了动态库的路径)
    使用命令ldd app可以查看当前的链接库情况

编译静态库文件 命名:lib + 库的名字 + .a
第一步:生成.o目标文件 使用gcc -c test.c -o test.o命令。
第二步:使用ar将.o打包成libXXX.a静态库 使用ar rcs -o libtest.a test.o命令

查看库内容:
nm [option(s)] [file(s)] 查看静态库包含哪些函数
ar 打包或解压静态库

查看可执行程序的链接库
ldd

查看可执行程序的文件位置
ps aux查出运行程序的pid。
再使用ls -l /proc/pid查看其中exe项的链接位置。
就是运行程序的绝对路径。

-x language filename 指定语法格式
设定文档所使用的语言,使后缀名无效,对以后的多个有效.
注:默认情况下,gcc是根据源文件名后缀名来判断源文件语言的
language:c',objective-c’, c-header',c++’, cpp-output',assembler’, and `assembler-with-cpp’.

-x none filename
关掉上一个选项,也就是让gcc根据文档名后缀,自动识别文档类型
例:gcc -x c hello.pig -x none hello2.c

-pipe
  使用管道代替编译中临时文档,在使用非gnu汇编工具的时候,可能有些问题
  gcc -pipe -o hello.exe hello.c

-ansi
  关闭gnu c中和ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一些asm inline typeof关键字,连同UNIX,vax等预处理宏,

-fno-asm
  此选项实现ansi选项的功能的一部分,他禁止将asm,inline和typeof用作关键字。
    
-fno-strict-prototype
  只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数的个数和类型说明,而不是没有参数.
  而gcc无论是否使用这个参数,都将对没有带参数的函数,认为城没有显式说明的类型
  
-fthis-is-varialble
  就是向传统c++看齐,能够使用this当一般变量使

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值