编译步骤
-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当一般变量使