gcc的编译过程分为三步:
第一步将 文件1.c 分别通过编译器解析成汇编语言
第二步将 文件1.s 文件2.s 文件3.s 分别通过汇编器 生成obj目标代码文件
第三步将 这些文件通过链接器生成 out 的可执行文件 ,将多个目标代码文件合成一个文件
而在第三步中链接方式有两种,一种是静态链接,另一种是动态链接。例如 A文件引用了B文件 ,所谓静态链接,就是将A和B打包进同一个最终可执行文件中。而动态链接,函数库B无需打包进可执行文件中,当A也需要引用到B时,A通过读链接库目录,获取关联的库来实现。而链接库目录通常被设置为环境变量。链接库的好处就是移植性好,静态链接的优点就是执行程序时不需要考虑再链接问题了,因为静态链接库中的代码已经被合成进可执行文件中,这样的坏处就是使得可执行文件大小变得大,显得浪费空间。
在一个文件 mysum.c中写入如下代码
在主程序 helloword.c 写入如下代码 ,可以看出 主程序中引用到了 mysum.c
一、静态链接
创建静态链接库:
gcc -c mysum.c -o mysum.o #把mysum.c 编译成目标文件 mysum.o
ar rcs libmysumlib.a mysum.o # 利用mysum.o 等文件创建出静态链接库
静态链接:-L. 指定链接库为当前目录, -l指定链接库
gcc -static helloworld.c -L. -l mysumlib -o helloworld.out #helloworld.c 编译静态链接 libmylib.a
需要注意的是链接库并未指定前缀 lib和后缀.a
执行
二、动态链接
创建动态链接库,并不需要ar等打包工具
gcc -c -fPIC mysum.c #生成.o文件
gcc -shared -o libmylib.so mysum.o #创建动态库
指定链接路径
gcc helloworld.c -L. -l mylib
必须设置 LD_LIBRARY_PATH 环境变量
export LD_LIBRARY_PATH=./ # 指定当前目录
./a.out 3 4 # 执行程序
如果链接库不再当前目录中,需要更改 -L选项 和 环境变量 LD_LIBRARY_PATH 以指向包含的链接库目录。或者可以运行ldconfig 来配置动态链接库路径。