GCC: GNU C Compiler; GNU Compiler Collection
常用基本命令
gcc test.c -o test
上述编译过程分为
预处理 Preprocessing
gcc -E test.c -o test.i 或 gcc -E test.c
gcc的-E选项,可以让编译器在预处理后停止,并输出预处理结果。
编译 Compilation
gcc -S test.i -o test.s
gcc的-S选项,表示在程序编译期间,在生成汇编代码后,停止,-o输出汇编代码文件。
汇编 Assembly
gcc -c test.s -o test.o
连接 Linking
gcc test.o -o test
将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。
编译多个文件
如果程序多个源文件,并且最终生成可执行文件test
gcc test1.c test2.c -o test
若同时处理的文件不止一个,那么GCC依旧会按照预处理,编译,链接的过程进行:
上述命令相当于依次执行
gcc -c test1.c -o test1.o
gcc -c test2.c -o test2.o
gcc test1.o test2.o -o test
Debug
gcc -Wall illcode.c -o illcode
使用 -Wall
能够使GCC产生尽可能多的警告信息。
gcc -Werror test.c -o test
使用 -Werror
可以让GCC在所有产生警告的地方停止编译。
链接库文件
在linux中,大多数函数的头文件会被放到
/usr/include
中,库文件一般放在/usr/lib
中。
在linux中,库文件分为两类,分别是 动态链接库
.so
,和 静态链接库.a
。两者的区别在于程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。
编译成可执行文件
gcc –c –I /usr/dev/mysql/include test.c –o test.o
链接
gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test
默认情况下,GCC链接时优先使用静态链接库,只有在动态链接库不存在的时候才使用静态链接库,如果需要强制使用静态链接库,那么加入
-static
静态库链接时搜索路径顺序:
- ld会去找GCC命令中的参数-L
- 再找gcc的环境变量LIBRARY_PATH
- 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的
动态链接时、执行时搜索路径顺序:
- 编译目标代码时指定的动态库搜索路径
- 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
- 配置文件/etc/ld.so.conf中指定的动态库搜索路径
- 默认的动态库搜索路径/lib
- 默认的动态库搜索路径/usr/lib
有关环境变量:
LIBRARY_PATH
环境变量:指定程序静态链接库文件搜索路径
LD_LIBRARY_PATH
环境变量:指定程序动态链接库文件搜索路径
Reference
https://www.cnblogs.com/ggjucheng/archive/2011/12/14/2287738.html