2012-03-28 55 views
0

我有一个工作项目(P1)与一个EXE调用一个STATIC库。它在Windows,MAC和Linux上编译和运行良好。CMake项目编译罚款SHARED库,但不与静态库

现在,我有第二个项目(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 ...),现在一切正常。

我没有任何线索为什么这是共享工作,但不是在静态。

感谢您的任何帮助。 此致敬礼。

回答

1

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

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

当你创建一个共享库A时,B中的所有符号都在创建B的时候被解析(所以连接器实际上是从B中查找它需要的)。因此,当您切换到共享库时,您的示例工作正常。

+0

那么,我会仔细检查,但这两个库都添加到CMake target_link_libraries ...我只是没有任何线索在哪里开始寻找。感谢您的建议! – Korchkidu 2012-03-28 15:37:20

+0

好吧,似乎我必须做一些像target_link_libraries(lib2 lib1)和target_link_libraries(EXE lib1 lib2)...这对你有意义吗? – Korchkidu 2012-03-28 17:12:33

+0

是的,那就是我的意思。您需要将您的可执行文件与_both_静态库链接,因为只有这样lib2才能从lib1中获得所需的符号(如果它们都是静态库,则无法将lib2链接到lib1)。 – 2012-03-29 07:25:29