xcodebuild链接器断言失败

5

在使用xcodebuild命令行构建iOS动态框架时,我遇到了ld断言错误。


0  0x10163b342  __assert_rtn + 144
1  0x101678a3a  archive::File<arm64>::makeObjectFileForMember(archive::File<arm64>::Entry const*) const + 1138
2  0x1016783e8  archive::File<arm64>::justInTimeforEachAtom(char const*, ld::File::AtomHandler&) const + 122
3  0x10168ea75  ld::tool::InputFiles::searchLibraries(char const*, bool, bool, bool, ld::File::AtomHandler&) const + 265
4  0x101697db8  ld::tool::Resolver::resolveUndefines() + 160
5  0x10169a117  ld::tool::Resolver::resolve() + 79
6  0x10163c060  main + 812
7  0x7fff9dd4c5ad  start + 1
A linker snapshot was created at:
/tmp/MyKit-2016-02-31-154836.ld-snapshot
ld: Assertion failed: (memberIndex != 0), function makeObjectFileForMember, file /Library/Caches/com.apple.xbs/Sources/ld64/ld64-253.9/src/ld/parsers/archive_file.cpp, line 355.
clang: error: linker command failed with exit code 1 (use -v to see invocation)

根据archive_file.cpp源代码(http://www.opensource.apple.com/source/ld64/ld64-253.3/src/ld/parsers/archive_file.cpp),似乎在ld加载库时存在某种符号损坏。但除此之外,我不知道如何解决这个问题。
只有当我尝试通过添加“-fembed-bitcode”编译器标志启用位码来构建我的框架时,才会出现此问题。
此外,在我的ld命令中,我正在尝试链接几个静态库之一是> 4.25 GB(内置位码),此大小超过了无符号32位整数的最大值(约为3.99 GB)。我以前遇到过一些与libtool相关的问题,无法处理大型二进制库,因此这是我怀疑的原因之一。
我想知道是否有人遇到过类似的问题或找到了解决方法?谢谢
几个相关问题

我从未见过的奇怪的xCode链接器错误,显示“断言失败”

https://github.com/SciRuby/nmatrix/issues/69

http://lists.llvm.org/pipermail/llvm-dev/2013-October/066722.html

https://github.com/TrinityCore/TrinityCore/issues/14689

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57438


1
4.25 GB 的静态库?!?:o - Almo
2个回答

6

您是否想要阅读有关错误的解释,即ld: Assertion failed: (memberIndex != 0) ...?请点击此链接

另外,请不要担心静态库的大小。链接器会在最终可执行文件中删除所有不必要的信息。请在此处阅读相关内容

TL; DR版本:

  1. 使用Command-Option-Shift-K清理您的项目。同时,选择Window > Organizer,切换到Projects选项卡。单击Derived Data文件夹名称右侧的右箭头,删除Derived Data文件夹,并重新启动XCode。

  2. 进入您项目设置中的Build Settings => 找到Linking->Other linker flags => 添加-v。如果仍然出现错误,则会显示导致错误的确切损坏文件。如果您再次遇到错误,请在此处发布损坏文件的路径,我们可以从那里开始解决问题。

  3. 您的错误原因是因为您的某个静态库已损坏。您可以删除4.25gb的库并重新构建,以查看是否存在此问题。它在您项目的目标设置 -> 构建阶段 -> 链接二进制文件与库下。如果错误消失了,那可能就是问题所在。在这种情况下,请提供库的名称。


谢谢。我已经尝试了 #1 和 #2,它们给了我相同的错误。-v 也没有提供太多额外的信息。对于 #3,在链接框架时,如果我删除静态库,连接器将抱怨未解析的符号错误,因为该库需要其他代码部分使用。 - dennycd
这个库叫什么?此外,在项目设置中启用“生成调试符号”可以帮助您在构建时减小静态库的大小。 - donkey

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接