linux下gcc的基本用法
gcc 是 GUN Compiler Collection的缩写,可以支持多种语言编译,比如 C,C++,Java, pascal 等
gcc的编译过程
- 预处理(pre-processing)E:插入头文件,替换宏
- 编译(Compiling)S:编译成汇编
- 汇编(Assembling) c:编译成目标文件
- 链接 (Linking):链接到库中,变成可执行文件
gcc -E hello.c -o hello.i
gcc -S hello.i –o hello.s
gcc –c hello.s –o hello.o
gcc hello.s –o hello 链接,生成可执行文件
/hello 运行
也可以一次性完成:
gcc hello.c –o hello
但一般情况下生成.o文件比较好,可以重定位文件,让别人使用
gcc常用选项
选项名 | 作用 |
---|---|
o | 生成目标 |
c | 取消链接步骤,编译源码并最后生成目标文件 |
E | 只运行C预编译器(头文件,宏等展开) |
S | 生成汇编语言文件后停止编译(.s文件) |
Wall | 打开编译告警(所有) |
g | 嵌入调试信息,方便gdb调试 |
llib | 链接 lib 库 (这里是小写 L ) 相当于 C++ #pragma comment(lib, “xxx.lib”) |
Idir | 增加 include 目录 (这里是大写 i ) 头文件路径 |
LDir | 增加 lib 目录 (编译静态库和动态库) |
多模块编译
-
一次性编译:
gcc -Wall fun.c main_fun.c –o main_fun
-
独立编译:
gcc –Wall –c main_fun.c –o main_fun.o
gcc –Wall –c fun.c –o fun.o
gcc –Wall main_fun.o fun.o –o main_fun
多模块编译中如果某一个模块发生了变化,只需要编译更改的模块即可
静态库与共享库(动态库)
静态库(.a)
程序在编译链接时候把库的代码链接到可执行文件中。程序运行时候,不再需要静态库,生成的可执行文件大,每个可执行文件都会加载一份拷贝到内存
-
静态库生成(libxxx.a)
首先生成.o文件,然后通过.o文件生成.a文件
例如:
gcc –c fun.c
ar rcs libfun.a fun.o
-
静态库使用
gcc –Wall main.c libfun.a –o main
gcc –Wall –L. main.c –o main –lfun
-L.表示在当前目录搜索 libfun.a
-
静态库搜索路径
1:编译使用选项 –L 指定的目录(建议)
2:修改环境变量,搜索指定的目录 设置环境变量 LIBRARY_PATH
export LIBRARY_PATH=“库目录”
3:lib文件放入系统指定目录,例如/usr/lib/等
共享库(.so或.sa)
程序运行时候才去链接共享库代码,多个程序共享使用,使用时候只需要加载一份到内存
直接可以通过.c文件生成.so文件
例如:gcc –shared –fPIC fun.o –o
shared:生成共享库格式
fPIC: 产生位置无关码,允许在任何地址加载 (否则只能从指定地址加载,无法控制)相对地址
使用: gcc –Wall main.o –o main –L. -lFun
只需要-l+文件名即可
配置方式
1:拷贝到so文件到共享库目录 /usr/lib/
2:更改 LD_LIBRARY_PATH,如果已经有了一个这样的目录,要写成export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:“库目录”这样子 如果写在profile配置文件里 export LD_LIBRARY_PA TH="目录:$LD_LIBRARY_PATH"
3:配置 /etc/ld.so.conf; 并使用 ldconfig 命令进行更新