【问题标题】:MinGW C++ Linker unable to find file due to truncating filename and/or unable to find definitions由于截断文件名和/或无法找到定义,MinGW C++ 链接器无法找到文件
【发布时间】:2020-10-09 21:30:33
【问题描述】:

我遇到了一个非常奇怪的链接器问题,它在不同的场景中以不同的方式表现出来。不幸的是,我无法分享任何来源,所以这有点遥远,但我缺乏追查此事的想法。

我正在尝试为将在 Windows 环境中运行的项目构建单元测试(因此不包括硬件相关功能)。我们还构建了相同的单元测试,以便它们可以在我们的目标(Renesas PK-S5D9)上运行,因此使用不同的编译器,它是成功的。请注意,我们使用的是 gtest,它是作为源包含的,而不是作为库。此构建中不涉及任何库,只有源代码。

场景:

  1. 正在一个分支上完成工作。 Develop 已更新,因此开发人员合并到新的 HEAD 中。这样做后,一个不相关的测试开始无法链接;让我们称测试 ATest.cpp 和产品源 A.cpp/h。链接器抱怨在 Ah 中声明并由 ATest.cpp 使用的函数未定义,但是,A.cpp 的构建成功,.o 存在于预期的位置,并且 .o 在链接命令中列出。
  2. 我拿了分支的负责人并排除了从开发中合并带来的文件(一个类和一个测试),并得到了一个不同的错误。前一行的末尾包含文件“./product/adapters/ActionableProvider.o”,当 g++ 尝试访问它时,该文件看起来会被截断:

  1. 我从分支中获取了开发和零碎添加的内容(一些更改和一个带有测试的新类)。当我几乎完成它时,我遇到了与场景 2 中列出的类似的错误。我尝试注释掉类中实现的函数的所有内容,并且截断减少了:

增加怪异的东西:

当使用相同的工具集但在我们的构建服务器上运行时,开发人员观察到失败的提交不会失败(Windows 10 构建略有不同,也没有重度防病毒,因为它在我们的内部网络中被分段) .

欢迎任何想法导致更多尝试将这个谜团拼凑在一起!

【问题讨论】:

    标签: gcc mingw linker-errors


    【解决方案1】:

    有一个顿悟的时刻。这是一个命令长度限制问题。显然 Windows 在一个命令中只能处理 8192 个字符,因此文件名被截断。这是一个参考:https://mcuoneclipse.com/2015/03/29/solving-the-8192-character-command-line-limit-on-windows/

    我们的最终解决方案是修改 e2studio (eclipse) 中的链接器命令:

    ${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}
    

    到:

    @$(file >link_cmd.in,${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}) ${COMMAND} @"link_cmd.in"
    

    旅程中的步骤包括提出可能的解决方案列表(如果我们能弄清楚如何实施它们:)):

    • 缩短路径
    • 制作图书馆
    • 弄清楚如何让 eclipse 在没有这个问题的不同 shell 中构建 test_desktop
    • 弄清楚如何让 eclipse 使链接器命令使用文件(参见 https://linux.die.net/man/1/g++ 中的 @file 选项)

    我们赞成最后一种解决方案,但我们只是意识到它是因为我们的目标特定单元测试就是这样规避了这个问题。一些搜索将我们带到https://www.eclipse.org/forums/index.php/t/369721/,最后一个帖子是有人指出他们发布了针对错误https://bugs.eclipse.org/bugs/show_bug.cgi?id=72965 的解决方法。非常感谢科内利乌祖祖!! 经过一些初步评估,我们意识到我们只需要使用类似的机制将命令转储到文件中(似乎 Corneliu Zuzu 有一个更具挑战性的问题,包括反斜杠?)。因此上述解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 2016-06-14
      相关资源
      最近更新 更多