gcc 编译链接过程
1、gcc 编译链接过程:
2、静态链接与动态链接:
-
静态链接:链接器在链接时将库的内容加到可执行程序中。
-
动态链接:链接器在链接时仅建立与所需库函数之间的链接关系,在程序运行时才将所需资源调入可执行程序中。
-
静态、动态编译:
-
程序默认情况是动态编译。
-
静态编译需要加入参数 -static
-
// 动态编译: gcc main.c -o test_share // 静态编译: gcc -static main.c -o test_static
-
3、静态库制作与使用:
-
静态库是一些目标代码(*.o)的集合,是在可执行程序运行前就加入到执行码中,成为执行码的一部分。
-
静态库以".a"作为文件后缀,“lib”作为前缀,中间是静态库名字。最终名字是 libxxx.a
-
静态库制作:
-
第一步: 将各种.c源文件和头文件(.h)直接编译成目标文件(.o)。
gcc -c add.c -o add.o gcc -c sub.c -o sub.o
第二步:使用程序 ar 将目标文件(*.o)打包成 .a 的静态库文件 libxxx.a
ar -rcs libtest.a add.o sub.o # 参数:r更新; c: 创建;s:创建索引
-
静态库的使用:
-
静态库制作完成后需要将其.a文件和头文件.h一起发给用户使用。
-
gcc test.c -L./ -I./ -ltest -o libtest # 参数: -L: 要链接的库所在的目录; # -I: 指定头文件的目录; # -l(小写L):指定链接所需的库,去掉前后缀。
-
4、动态库的制作与使用:
-
共享库在程序编译时不会被链接到目标代码中,在程序运行时才被载入。不同程序调用相同的库,只需在内存中存有一份共享库即可。
-
一般以后缀".so"命名, 前缀为"lib",所以共享库一般命名为“libxxx.so"
-
动态库的制作:
-
第一步:将源文件.c 编译成目标文件 ,需要加编译选项 -fpic(position independent code), -c
gcc -fpic -c add.c gcc -fpic -c sub.c # 参数:-fpic创建与地址无关的编译程序,为了能够在多个应用程序间共享。
第二步:生成共享库,需要加链接器选项 -shared(指定生成动态链接库)
gcc -shared add.o sub.o -o libtest.so
第三步:通过 nm 命令查看对应的函数:
nm libtest.so | grep "add"
-
-
通过命令ldd可以查看可执行文件依赖的动态库。
-
ldd prog
-
动态库的测试:
-
动态库制作完成后,引用动态库编译成可执行文件:
-
gcc test.c -L./ -I./ -ltest
- ./a.out后发现报错,找不到对应库文件。
-
如何让系统找到动态库?
-
拷贝自己制作的共享库到/lib或者/usr/lib中
-
临时设置LD_LIBRARY_PATH:
-
export LD_LIBRARY_PATH=$LD_LIBRARY:库路径(绝对路径)
-
-
使用符号链接,一定使用绝对路径:
-
sudo ln -s 库路径(绝对路径) /lib/libtest.so
-
-
-