例如:在当前文件夹下有 test1.c test2.c test3.c test.h 文件。
一、静态库的制作和使用
1、首先将所有需要打包成静态库的.c文件编译为二进制文件(*.o)。
命令:gcc *.o -c
2、将编译好的*.o文件打包。
命令:ar -r libptest.a *.o
3、使用。若有文件使用了这个静态库那么将要包含test.h头文件。如:使用静态库的文件为file.c。静态库放在当前目录的下一级目录aa里。
命令:gcc file.c -Laa -lptest -Iaa -o file.out
说明-L 后面写的是静态库文件的所在的路径。
-l (小L) 后面写的是静态库文件的名字。(静态库文件的名字:libptest.a 。 lib为前缀 .a为后缀 中间的ptest就是静态库的名字)。
-I (大i) 是将一个路径加到系统搜索路径下去。(include <test.h>不知道去哪儿搜索这个头文件。所以将test.h所在目录添加到当前系统搜索的路径下去)。
二、动态库的制作和使用
1、将需要添加到动态库里的文件编译为与位置无关的二进制文件(*.o)。-fPIC 参数 与位置无关。
命令:gcc -fPIC *.c -c
2、将第一步做好的与位置无关的二进制文件打包到动态库文件中。
命令:gcc -shared -o libptest.so *.o
3、使用。若有文件使用了这个动态库那么将要包含test.h头文件。如:使用动态库的文件为file.c。动态库放在当前目录的下一级目录aa里。
命令:gcc file.c -Laa -lptest -Iaa -o file.out
生成了一个file.out 可执行文件。
这时候执行file.out 会出现错误。错误原因:找不到libptest.so这个动态库文件。
可以执行命令ldd file.out 查看file.out 需要依赖哪些动态库文件。
解决方法(两种):
1、将libptest.so这个动态库文件的目录添加到加载器搜索的环境变量里(LD_LIBRARY_PATH)。
命令:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:aa
再次执行file.out ok成功。
2、将libptest.so这个动态库文件移动到 /lib 或者 /usr/lib下。
再次编译时就可以不用指定动态库的路径了。
命令:gcc file.c -lptest -Iaa
执行file.out ok 成功