CMake项目编译精细的SHARED库,但不使用STATIC库
CMake project compiling fine SHARED libs but not with STATIC libs
我有一个正在工作的项目(P1),其中有一个EXE调用STATIC lib。它在Windows、MAC和Linux上编译和执行良好。
现在,我有第二个项目(P2),其中有一个EXE调用一个STATIC库,该库也调用另一个STATIC库。在这种情况下,它在WINDOWS和MAC上运行良好,但在Linux上,我在链接时得到了很多未找到的参考。我检查过:
- libs在那里。好的
- 编译器有权访问它们。好的
- 来自P1和P2的CMake文件是相似的。好的
- 编译器标志和命令是相似的。好的
我绝望了,我只是把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中查找它需要的内容)。因此,当您切换到共享库时,您的示例会起作用。
相关文章:
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 收到错误"invalid use of non-static data member 'stu::n' "
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 我应该在 C++ 中何时/为什么使用 STATIC?
- 在VS2019项目中集成ImageMagick:x64-windows-static library
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- 引用 std::shared:ptr 以避免引用计数
- "static char __ = []() -> char"的含义
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- 无法在 DLL 中链接 SDL2-static.lib
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- C++线程"Call to non-static member function without an object argument"
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- 出现这种错误的原因是什么"invalid use of non-static data member "
- static是如何使用ClassA::m_variable处理所有类对象的
- LNK2001:未解析的外部符号public:static类std::vector
- 使用-static libstdc++时std::线程弱,因此在运行时会导致崩溃
- CMake项目编译精细的SHARED库,但不使用STATIC库
- 引用 MFC 的多个项目:"use mfc in a static library" vs "use mfc in a shared dll" ?