我有一个工作项目(P1),EXE调用STATIC lib。它在Windows,MAC和Linux上编译和执行。
现在,我有一个第二个项目(P2),其中一个EXE调用一个STATIC库,它也调用另一个STATIC库。在这种情况下,它在WINDOWS和MAC上工作正常,但在Linux上,我得到很多链接时找不到的引用。我查了一下:
我很绝望,我只是将libs从STATIC切换到SHARED。而现在,它在Linux上编译得很好。基本上,我刚刚将add_library(lib STATIC ...)
更改为add_library(lib SHARED ...)
,现在一切正常。
我不知道为什么这在SHARED中工作但在STATIC中没有。
感谢您的帮助。 最好的问候。
答案 0 :(得分:1)
当您的静态库A依赖于另一个静态库B时,在创建A期间不会解析此依赖关系,但是当您将可执行文件链接到A.时,链接器需要B来解析A所需的符号(取决于你对A)的使用。
我现在找不到关于此的任何细节,但我强烈认为Visual Studio(或与CMake的组合)会自动添加这些库,因此它适用于Windows。在Linux上,您需要向链接库中显式添加B才能成功链接可执行文件。
当您创建共享库A时,B的所有符号在创建B期间被解析(因此链接器实际上从B中查找它需要的内容)。因此,您的示例在切换到共享库时有效。