在打包函数工具的时候,我们一般有两种方式,生成静态库或者动态库的方式。
- 静态库和动态库都是以lib开头命名。
- 静态库以.a结尾,动态库以.so结尾。
如libhello.so
, hello
是库的名称。
生成静态库(libhello.a
):
gcc -c hello.c
ar cr libhello.a hello.o
gcc -o main main.c -L. -lhello
生成动态库(libhello.so
)
gcc -c hello.c
gcc -shared -fPIC -o libhello.so hello.o
gcc -o main main.c -L. -lhello
./main
运行的时候从/lib
或者/usr/lib
中查找动态库文件,所有一般把动态库文件放在这两个目录下面。
如果放在其他目录下,可以设置LD_LIBRARY_PATH
路径。
export LD_LIBRARY_PATH=./
动态库和静态库的区别:
- 静态库在编译的时候进行链接。
- 动态库在运行时链接。
- 静态库编译出的可执行文件大,运行时不用查找,执行效率高。
- 动态库运行时查找库文件进行链接,效率低,但是在更新可执行文件的时候不需要重新编译,只需要更新库文件。