gpt4 book ai didi

c++ - CMake 项目编译良好的 SHARED 库但不使用 STATIC 库

转载 作者:行者123 更新时间:2023-11-28 08:07:46 25 4
gpt4 key购买 nike

我有一个工作项目 (P1),其中有一个调用静态库的 EXE。它在 Windows、MAC 和 Linux 上编译和执行良好。

现在,我有第二个项目 (P2),其中一个 EXE 调用一个 STATIC 库,它也调用另一个 STATIC 库。在这种情况下,它在 WINDOWS 和 MAC 上运行良好,但在 Linux 上,我在链接时得到了很多未找到的引用。我查了一下:

  1. 库在那里。好的
  2. 编译器可以访问它们。好的。
  3. P1 和 P2 的 CMake 文件相似。好的。
  4. 编译器标志和命令是相似的。好的。

我很绝望,只​​是将库从 STATIC 切换为 SHARED。现在,它在 Linux 上编译得很好。基本上,我只是将 add_library(lib STATIC ...) 更改为 add_library(lib SHARED ...) 现在一切正常。

我不知道为什么这在 SHARED 中有效但在 STATIC 中无效。

感谢您的帮助。最好的问候。

最佳答案

当您的静态库 A 依赖于另一个静态库 B 时,这种依赖性不会在创建 A 时解决,而是在您将可执行文件链接到 A 时解决。只有这样链接器才需要 B 来解析 A 所需的符号(取决于你对 A 的使用)。

我现在找不到关于此的任何详细信息,但我强烈认为 Visual Studio(或与 CMake 的组合)会自动添加这些库,因此它可以在 Windows 上运行。在 Linux 上,您需要明确地将 B 添加到您的链接库中才能成功链接您的可执行文件。

当您创建一个共享库 A 时,来自 B 的所有符号都在创建 B 的过程中被解析(因此链接器实际上从 B 查找它需要的东西)。因此,当您切换到共享库时,您的示例有效。

关于c++ - CMake 项目编译良好的 SHARED 库但不使用 STATIC 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9909804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com