1. 简单编译
示例程序如下:
//test.c#include <stdio.h>
int main
{
printf("Hello World\n");
return 0;
}
一步到位的编译指令:gcc test.c -o test
2. 完整编译过程
2.1 预处理
gcc -E test.c -o test.i
2.2 编译,将高级语言转换为汇编代码
gcc -S test.i -o test.s
2.3 汇编,把汇编代码翻译成目标机器指令
gcc -c test.s -o test.o
2.4 链接
gcc test.o -o test
3. 多个程序文件的编译
gcc test1.c test2.c -o test
上面这条命令大致相当于依次执行如下三条命令:
gcc -c test1.c -o test1.o
gcc -c test2.c -o test2.o
gcc test1.o test2.o -o test
4. 错误检查
使用-pedantic,源码中使用了扩展语法的地方将产生警告信息:gcc -pedantic test.c -o test
使用-Wall产生警告信息:gcc -Wall test.c -o test
使用-Werror产生警告时停止编译:gcc -Werror test.c -o test
5. 库文件链接
假设test.c文件需要链接libtest库,该库有动态库libtest.so和静态库libtest.a两个版本。
libtest库的头文件位于~/include,库文件位于~/lib下。
5.1 编译成可执行文件
gcc -I ~/include -c test.c -o test.o
5.2 链接
gcc test.o -o test -L ~/lib -ltest
5.3 强制链接时使用静态链接库
默认情况下,gcc在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库,如果需要的话可以在编译时加上-static选项,强制使用静态链接库 gcc test.o -o test -L ~/lib -static -ltest
静态库链接时搜索路径顺序:
1. ld会去找GCC命令中的参数-L
2. 再找gcc的环境变量LIBRARY_PATH
3. 再找内定目录 /lib/usr/lib /usr/local/lib
动态链接时、执行时搜索路径顺序:
1. 编译目标代码时指定的动态库搜索路径
2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径
4. 默认的动态库搜索路径/lib
5. 默认的动态库搜索路径/usr/lib
有关环境变量:
LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径
摘抄自 http://www.cnblogs.com/ggjucheng/archive/2011/12/14/2287738.html
445

被折叠的 条评论
为什么被折叠?



