C++静态库与动态库

参考blog,图片来源于该博客。
库分为静态库(linux .a windows .lib)和动态库(linux .so windows .dll)

创建静态库

静态库:是目标文件(.o文件)与引用的库加载链接到一块生成可执行文件,这种链接方式为静态链接,所以链接的库为静态库。
C++静态库与动态库_第1张图片
静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。静态库特点总结:

  • 静态库对函数库的链接是放在编译时期完成的。
  • 程序在运行时与函数库再无瓜葛,移植方便。
  • 浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。

下面编写一些简单的C++类,将其编译成静态库给他人用,头文件如下所示:
Linux下使用ar工具、Windows下vs使用lib.exe,将目标文件压缩到一起,并且对其进行编号和索引,以便于查找和检索。一般创建静态库的步骤如图所示:
C++静态库与动态库_第2张图片
Linux静态库命名规范,必须是”lib[your_library_name].a”:lib为前缀,中间是静态库名,扩展名为.a。
首先将代码编译为目标文件(.o)

g++ -c a.cpp

通过ar工具将目标文件(.o)打包为静态库文件(.a)

ar -crv liba.a a.o

静态库的使用
Linux下使用静态库,只需要在编译的时候,指定静态库的搜索路径(-L选项)、指定静态库名(不需要lib前缀和.a后缀,-l选项)

g++ main.cpp -L../StaticLibrary -I a
  • -L:表示要连接的库所在目录

  • -l:指定链接时需要的动态库,编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.a或.so来确定库的名称

    动态库
    首先,生成目标文件,此时要加编译器选项-fpic,-fPIC 创建与地址无关的编译程序(pic,position independent code),是为了能够在多个应用程序间共享。

    g++ -fPIC -c a.cpp
    g++ -shared -o liba.so a.o

    然后,生成动态库,此时要加链接器选项-shared,其实两个步骤可以合并为一个命令

    
    g++ -fPIC -shared -o liba.so sayhell.cpp

你可能感兴趣的:(C++)