我有一个项目,它曾经是一组巨大的源文件,所有文件都被编译然后链接为一个可执行文件。作为使项目更加模块化的第一步,我将构建分解为几个更小的块并使其成为静态库。有一个层次结构,所以 Exe1
将链接到静态库 Lib2A
和 Lib2B
。 Lib2A
will depend on static Lib3A
, lib3B
, lib3C
, etc. The numbers here show their layer in the hierarchy.
问题是我需要在链接时使用 --whole-archive
,否则找不到来自底层库的某些符号。
当我为 Exe1
的链接添加以下内容时:
target_link_libraries(Exe1 -Wl,--whole-archive Lib2A Lib2B -Wl,--no-whole-archive)
我最终得到了一个实际的链接阶段命令,例如:
g++ -o Exe1 -Wl,--whole-archive libLib2A.a libLib2B.a -Wl,--no-whole-archive libLib3A.a libLib3B.a libLib3C.a
不可避免地,一些第 3 层静态库中的符号会丢失,并且我会出现丢失符号错误。
我预计因为 Lib2A
有 Lib3*
库作为依赖项,所以它们也将在 --whole-archive
外部链接器命令的一部分“内部”,但.
我尝试了许多不同的组合(例如将 --whole-archive
东西放在较低层),但没有遇到使用 CMake 的方法。我究竟做错了什么?
谢谢
原文由 Rich von Lehe 发布,翻译遵循 CC BY-SA 4.0 许可协议
对于 3.12 和更新版本的 CMake,我会使用对象库。
我为早于该版本的版本找到的解决方法是创建一个中间静态库,该库使用一些属性魔法将所有链接依赖项放在 –whole-archive 部分中。对我来说,顶级静态库被称为“源”。它本身实际上不包含任何内容,但对一堆其他静态库具有链接依赖关系。我创建了“源组合”,如下所示:
现在,当我通过链接这个源组合库来创建可执行文件或共享库时,我得到了 –whole-archive 和 –no-whole-archive 作为 整个 静态库集的书挡,这些静态库是链接依赖项’资源’。偶然发现这种技术需要很长时间,所以我正在分享它。