CMake项目编译精细的SHARED库,但不使用STATIC库

CMake project compiling fine SHARED libs but not with STATIC libs

本文关键字:STATIC SHARED 编译 项目 CMake      更新时间:2023-10-16

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

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

  1. libs在那里。好的
  2. 编译器有权访问它们。好的
  3. 来自P1和P2的CMake文件是相似的。好的
  4. 编译器标志和命令是相似的。好的

我绝望了,我只是把libs从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中查找它需要的内容)。因此,当您切换到共享库时,您的示例会起作用。