CMake项目编译精细的SHARED库而不是STATIC库

时间:2012-03-28 14:38:35

标签: c++ cross-platform cmake

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

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

  1. libs在那里。行
  2. 编译器可以访问它们。行。
  3. 来自P1和P2的CMake文件类似。行。
  4. 编译器标志和命令类似。行。
  5. 我很绝望,我只是将libs从STATIC切换到SHARED。而现在,它在Linux上编译得很好。基本上,我刚刚将add_library(lib STATIC ...)更改为add_library(lib SHARED ...),现在一切正常。

    我不知道为什么这在SHARED中工作但在STATIC中没有。

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

1 个答案:

答案 0 :(得分:1)

当您的静态库A依赖于另一个静态库B时,在创建A期间不会解析此依赖关系,但是当您将可执行文件链接到A.时,链接器需要B来解析A所需的符号(取决于你对A)的使用。

我现在找不到关于此的任何细节,但我强烈认为Visual Studio(或与CMake的组合)会自动添加这些库,因此它适用于Windows。在Linux上,您需要向链接库中显式添加B才能成功链接可执行文件。

当您创建共享库A时,B的所有符号在创建B期间被解析(因此链接器实际上从B中查找它需要的内容)。因此,您的示例在切换到共享库时有效。