【问题标题】:Are linux package manager installed libraries statically or dynamically linked?linux 包管理器安装的库是静态链接还是动态链接?
【发布时间】:2017-10-01 01:47:45
【问题描述】:

如果以cryptopp 为例,使用sudo apt install libcrypto++-dev 安装,然后使用#include <cryptopp/base64.h> 包含,该库是静态链接还是动态链接?

CMakeLists.txt 在target_link_libraries 中包含cryptopp

【问题讨论】:

  • StackOverflow 旨在帮助人们修复现有的编程代码。请阅读stackoverflow.com/help/on-topicstackoverflow.com/help/how-to-askstackoverflow.com/help/dont-askstackoverflow.com/help/mcve 并在此处发布更多问题之前使用tour。这可能更适合unix.stackexchange.com。祝你好运。
  • @shellter 感谢您提供链接。虽然对于有经验的用户来说这个问题可能看起来很愚蠢,但对于一个新的 C++ 用户来说,这是一个有效的问题。很大一部分人不了解 linux/c++ 如何在系统库方面协同工作。在代码方面,我正在阅读一个已完成的、正在运行的项目,并试图理解它。
  • 虽然 question 肯定与编程有关(而且,从我的角度来看,这里是 on-topic),但 >answer 与编程无关:检查随包安装的文件。如果包安装了.a 文件,那么这些是静态 库,.so 文件是动态 库。如果软件包同时安装了 both .a.so 文件,并且您想了解 preference,请重新提出您的问题。
  • Crypto++ 最近移除了 CMake。我们无法正确配置事物,并且在与该工具进行简单任务时达到了极限。使用 CMake 需要您自担风险。另请参阅 Crypto++ wiki 上的 Issue 506, Remove CMake from library sourcesCMake Removal

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


【解决方案1】:

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

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

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

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

-l 名称规范

--library=namespec

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

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

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

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

【讨论】:

  • 感谢您的解释。您能否澄清在项目编译后是否可以确定可执行文件是使用静态链接库还是动态链接库?除了在没有安装依赖项的机器上运行它。另外,不同的库可以不同的链接吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多