linux包管理器是静态安装库还是动态链接?

时间:2017-10-01 01:47:45

标签: linux cmake shared-libraries static-libraries package-management

如果使用cryptopp安装了sudo apt install libcrypto++-dev作为示例,然后使用#include <cryptopp/base64.h>进行了包含,那么此库是静态还是动态链接的?

CMakeLists.txt包含cryptopp中的target_link_libraries

1 个答案:

答案 0 :(得分:1)

  

将[通过包管理器安装的库]静态或动态链接?

这取决于几个因素。首先,两个库都必须可用。对于Unix和Linux上的Crypto ++,静态和动态库都可用。在Windows上,仅提供静态库。

其次,假设两个库都可用,链接器的配置很重要。在具有ld的Linux上,默认情况下始终使用动态库。在OS X上,默认情况下也始终使用动态库。在Windows上,链接器配置不会影响因为选项控制它。

第三,它取决于链接器选项。在Windows上 - 如果动态库可用 - 它将取决于您链接到的库。它可能是动态链接库的导入库上的静态。在ld的Linux上,您可以使用:filename链接静态库:

  

-l namespec

     

<强> - 库= namespec

     

将namespec指定的存档或目标文件添加到列表中   要链接的文件。此选项可以使用任意次。如果   namespec的格式为:filename,ld将搜索库路径   一个名为filename的文件,否则它将搜索库路径   一个名为libnamespec.a的文件。

     

在支持共享库的系统上,ld也可以搜索   libnamespec.a以外的文件。具体来说,在ELF和SunOS上   系统,ld将在目录中搜索一个名为的库   libnamespec.so在搜索名为libnamespec.a的文件之前。 (通过   约定,.so扩展名表示共享库。)请注意   此行为不适用于:filename,它始终指定a   文件名为filename。

     

链接器将仅在存档位置搜索一次存档   在命令行中指定。如果存档定义了符号   在归档之前出现的某个对象中未定义   在命令行上,链接器将包含相应的文件   来自档案馆。但是,出现的对象中存在未定义的符号   稍后在命令行上不会导致链接器搜索   再次存档。

最后,使用CMake时,行为并不是一件简单的事情。默认行为可能是不添加任何内容。将-lcryptopp-l:cryptopp添加到LDFLAGSLDLIBS将无效,因为CMake不遵守惯用标记。您必须手动将库添加到每个目标。