gcc
编译程序的过程
预处理(Pre-Processing)
编译(Compiling)
汇编(Assembling)
链接(Linking)
选项名
|
作用
|
-o
|
产生目标(.i、.s、.o、可执行文件等)
|
-c
|
通知gcc取消链接步骤,即编译源码并在最后生成目标文件
|
-E
|
只运行C预编译器
|
-S
|
告诉编译器产生汇编语言文件后停止编译,产生的汇编语言文件扩展名为.s
|
-Wall
|
使gcc对源文件的代码有问题的地方发出警告
|
-Idir
|
将dir目录加入搜索头文件的目录路径
|
-Ldir
|
将dir目录加入搜索库的目录路径
|
-llib
|
链接lib库
|
-g
|
在目标文件中嵌入调试信息,以便gdb之类的调试程序调试
|
静态库与共享库
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
共享库( .so或.sa ):程序在运行的时候才去链接共享库的代码,多个程序共享使用库的代码。
一个与共享库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该共享库中复制到内存中,这个过程称为动态链接(dynamic linking)
共享库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份共享库被要用到该库的所有进程共用,节省了内存和磁盘空间。
生成静态库
hello_fn.h
hello_fn.c
main.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
库搜索路径
C_INCLUDE_PATH、LIBRARY_PATH
从左到右搜索-I -L指定的目录。
由环境变量指定的目录
由系统指定的目录
生成共享库
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
运行共享库
q1、拷贝.so文件到系统共享库路径下
一般指/usr/lib
q2、更改LD_LIBRARY_PATH
q3、ldconfig
配置ld.so.conf,ldconfig更新ld.so.cache