如果使用cryptopp
安装了sudo apt install libcrypto++-dev
作为示例,然后使用#include <cryptopp/base64.h>
进行了包含,那么此库是静态还是动态链接的?
CMakeLists.txt包含cryptopp
中的target_link_libraries
。
答案 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
添加到LDFLAGS
或LDLIBS
将无效,因为CMake不遵守惯用标记。您必须手动将库添加到每个目标。