繁体   English   中英

CMake项目编译良好的共享库,但不能使用静态库

[英]CMake project compiling fine SHARED libs but not with STATIC libs

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

现在,我有另一个项目(P2),其中一个EXE调用了STATIC库,该EXE也调用了另一个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查找所需的内容)。 因此,当您切换到共享库时,您的示例有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM