【问题标题】:CMake link stage questionCMake链接阶段问题
【发布时间】:2010-07-23 18:26:31
【问题描述】:

我目前正在构建一个相当大的应用程序,使用 cmake 生成跨平台构建脚本。在整理 cmake 构建脚本的过程中,我发现了 gcc 链接行排序的痛苦。

基本问题是,以错误的顺序包含静态库会导致未使用的库符号被丢弃,随后的依赖库无法找到。

因此,我处于 ​​cmake 生成一个编译得很好的 Visual Studios 构建系统的情况,但是 unix makefile 会抛出各种“未定义符号”错误。我已经找到了解决方法 - 在 add_executable 命令中,我包含了两次静态库。

我希望有一种更标准/更好的方法来处理这个问题。因为我不是唯一的开发人员,而且大部分常规开发都是在 Windows 中完成的,所以我真的想要一个与链接顺序无关的 CMake 脚本。 Windows 开发人员只是不处理此链接顺序问题。最重要的是,找出正确的顺序将非常困难 - 我没有现成的信息,并且有很多静态库(70 左右)。

在互联网上搜索后,我确实了解了 -static 和 -dynamic 标志,但是让 CMake 包含它们并不明显,并且 gcc 抱怨无法找到动态库。

无论如何,我欢迎有关如何做正确事情的建议。

【问题讨论】:

    标签: c++ linker cmake


    【解决方案1】:

    您是否尝试禁用条带?也许像cmake -DCMAKE_STRIP=/bin/true .. 这样的东西?也许这会阻止符号被丢弃。

    【讨论】:

      【解决方案2】:

      我认为这不是 CMake 问题,而是 GCC 行为。这个问题/答案应该会有所帮助:

      Linker order in GCC

      您将不得不硬着头皮修改您的 CMakeLists.txt 文件以在 Linux 上正确链接。由于 Windows 开发人员不在乎,因此您不应该打扰他们。

      最好的,
      -丹

      【讨论】:

      • 生活中没有什么是容易的:
      • 您可能会坚持要求 Windows 开发人员尽可能多地关注 linux 构建,因为他们可以要求您注意栅栏的 Windows 一侧。
      • 您可以设置一个 Cdash 服务器并在您的 linux 构建中断时惹恼 Windows 开发人员。很适合我们 (cdash.org)。
      猜你喜欢
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      相关资源
      最近更新 更多