C/C++中的链接库

风行水上 @ 2011-08-17 17:56:31
标签:

    链接库将一组代码以特定的形式包装在一起,以起来重用的目的。C/C++中的链接库可以分为静态链接库(static)和动态链接库(dynamic/shared)两种。

    静态链接库(static)

    静态链接库的文件名后缀通常是 ".a"。

    程序如果是和静态连接库进行链接(link),则相关代码被包含在程序中,程序运行时不再依赖外部文件。

    静态链接库的好处是用户拿到程序后可以直接运行。缺点是程序文件可能会比较大一些。

    静态链接库的制作

    静态链接库的制作主要分为两步:编译和打包。

    gcc -o mylib.o -c mylib.c   ; # 编译
    ar rcs libmylib.a mylib.o   ; # 打包
    

    静态链接库的使用

    主要是使用选项-static

    gcc -static -o main.exe main.cpp -lmylib
    

    动态链接库(shared)

    动态链接库的文件名后缀通常是 ".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
    

    网络资源

    标签:

      分享到:
      comments powered by Disqus

      33/37ms