GCC快速入门
GCC:GNU Compiler Collection 的缩写。最初作为C语言的编译器,现在已经支持多种语言了。如C、C++、Java 等语言。
Gcc 编译过程示意图
GCC常用选项
选项名 |
作用 |
-c |
通知gcc取消链接步骤,编译源码并产生目标代码 |
-o |
产生目标文件(.s .o .i) .o .i) |
-E |
只运行C预编译器 |
-S |
产生汇编文本后停止编译 |
-Wall |
使gcc对源文件的代码有问题的地方发出警告 |
-g |
在目标文件中嵌入调试信息,以便gdb之类的调试程序调试 |
-Idir |
将dir目录加入搜索头文件的目录路径
|
-Ldir |
将dir目录加入搜索库的目录路径
|
-llib |
链接lib库 |
gcc -E hello.c -o hello.i(预处理)
gcc -S hello.i -o hello.s(编译)
gcc -c hello.s -o hello.o(汇编)
gcc hello.o -o hello(链接)
gcc hello.c -o hello(直接编译链接成可执行目标文件)
gcc -c hello.c或gcc -c hello.c -o hello.o(编译生成可重定位目标文件)
头文件:
在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统及库函数调用的声明。
库文件:
库文件是一些预先编译好的函数集合,那些函数都是按照可重用原则编写的。它们通常由一组互相关联的用来完成某项常见工作的函数构成。比如用来处理屏幕显示情况的函数(ncurses库)和数据库访问例程(dbm库)等 。
头文件的位置:
/usr/include及其子目录底下的include文件夹
/usr/local/include及其子目录底下的include文件夹
库文件的位置:
/usr/lib
/usr/local/lib\
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
共享库( .so或.sa ):程序在运行的时候才去链接共享库的代码,多个程序共享使用库的代码。
使用静态库:
现有文件:hello_fn.h、hello_fn.c、main.c//main.c 用到了hello_fn.c里的函数
gcc -Wall hello_fn.c -o hello_fn.o
ar rcs libhello.a hello_fn.o
ar是gnu归档工具,rcs表示(replace and create)
gcc -Wall main.c libhello.a -o main
gcc -Wall -L. main.c -o main -lhello
使用共享库:
shared: 表示生成共享库格式
fPIC:产生位置无关码(position independent code)
库名规则:libxxx.so
示例:gcc -shared -fPIC hello.o –o libhello.so
编译选项
l:链接共享库,只要库名即可(去掉lib以及版本号)
L:链接库所在的路径.
示例:
gcc main.o -o main –L. -lhello
静态库链接时搜索路径顺序:
1、ld回去找GCC命令中的参数-L
2、再去找GCC的环境变量LIBRARY_PATH
3、再找内定目录/lib /usr/lib /usr/local/lib 这是当初compiler gcc时写在程序内的动态链接时、执行时搜索路径顺序
动态链接时、执行时搜索路径顺序:
1、编译代码时指定的动态搜索库路径
2、环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3、配置文件/etc/ld.so.conf 中指定的动态搜索路径
4、默认的动态库搜索路径/lib
5、默认的动态库搜索路径/usr/lib