如果cryptopp
作为示例安装 usingsudo apt install libcrypto++-dev
然后包含 using #include <cryptopp/base64.h>
,该库是静态链接还是动态链接?
CMakeLists.txt 包含cryptopp
在target_link_libraries
.
如果cryptopp
作为示例安装 usingsudo apt install libcrypto++-dev
然后包含 using #include <cryptopp/base64.h>
,该库是静态链接还是动态链接?
CMakeLists.txt 包含cryptopp
在target_link_libraries
.
[通过包管理器安装的库] 是静态链接还是动态链接?
这取决于几个因素。首先,两个库都必须可用。对于 Unix 和 Linux 上的 Crypto++,静态库和动态库都可用。在 Windows 上,仅提供静态库。
其次,假设两个库都可用,链接器的配置很重要。在带有 的 Linux 上ld
,默认情况下始终使用动态库。在 OS X 上,也总是默认使用动态库。在 Windows 上,链接器配置不会影响事情,因为选项控制它。
第三,它取决于链接器选项。在 Windows 上 - 如果动态库可用 - 这将取决于您链接到的库。它可以是动态链接库的导入库上的静态。在 Linux 上,ld
您可以使用:filename
与静态库链接:
-l 名称规范
--library=namespec
将 namespec 指定的存档或目标文件添加到要链接的文件列表中。此选项可以使用任意次数。如果namespec 的格式为:filename,ld 将在库路径中搜索名为filename 的文件,否则它将在库路径中搜索名为libnamespec.a 的文件。
在支持共享库的系统上,ld 还可以搜索 libnamespec.a 以外的文件。具体来说,在 ELF 和 SunOS 系统上,ld 将在目录中搜索名为 libnamespec.so 的库,然后再搜索名为 libnamespec.a 的库。(按照惯例,.so 扩展名表示共享库。)请注意,此行为不适用于 :filename,它始终指定一个名为 filename 的文件。
链接器只会在命令行中指定的位置搜索存档一次。如果存档定义了在命令行上出现在存档之前的某个对象中未定义的符号,则链接器将包含存档中的适当文件。但是,稍后在命令行上出现的对象中的未定义符号不会导致链接器再次搜索存档。
最后,在使用 CMake 时,行为并不是一件简单的事情。默认行为可能是不添加任何内容。添加-lcryptopp
or-l:cryptopp
到您的LDFLAGS
orLDLIBS
将没有任何效果,因为 CMake 不尊重习惯标志。您必须手动将库添加到每个目标。