链接库将一组代码以特定的形式包装在一起,以起来重用的目的。C/C++中的链接库可以分为静态链接库(static)和动态链接库(dynamic/shared)两种。
静态链接库的文件名后缀通常是 ".a"。
程序如果是和静态连接库进行链接(link),则相关代码被包含在程序中,程序运行时不再依赖外部文件。
静态链接库的好处是用户拿到程序后可以直接运行。缺点是程序文件可能会比较大一些。
静态链接库的制作主要分为两步:编译和打包。
gcc -o mylib.o -c mylib.c ; # 编译 ar rcs libmylib.a mylib.o ; # 打包
主要是使用选项-static
。
gcc -static -o main.exe main.cpp -lmylib
动态链接库的文件名后缀通常是 ".so"。在Windows系统中,其文件名后缀是".dll"。
程序如果是和动态连接库进行链接(link),程序运行时需要能够找到相应的动态链接库文件。
使用动态链接库存编译的程序在运行时要求用户的机器上必需也安装了相应的动态链接库文件,这些库文件需要放置在特定的目录,以让程序能够加载这些库。
虽然这似乎没有使用静态链接库的程序使用方便,但却减少了程序的大小。对于那些会被很多程序使用到的库,使用动态链接的好处就更加明显了。
gcc -shared -fPIC -o libmylib.so mylib.c ; # 编译成为shared library
选项-fPIC
在AMD64上是必须的,其它平台是则不是必要选项。PIC的意思是 Position Independent Code
关于-fPIC
的使用,可以参考 HOWTO fix -fPIC errors。
编译动态链接库时,如果需要链接静态库,并把链接库的内容包含到要编译的动态库中,可以使用选项-Wl,--whole-archive
。
例如:
gcc -shared -o libmylib.so -Wl,--whole-archive libmylib.a \ -Wl,--no-whole-archive libother.a
上面的-Wl
表示传递给linker(链接器)。
如果没有指定-static
选项,则默认使用动态链接的方式。
gcc -o main.exe main.cpp -lmylib