Xcode 链接错误: 文件对于架构 x86_64 太小

102

我正在Xcode中开发一个应用程序。

当我尝试构建时,会出现以下错误:

ld: in /Users/theodore/Library/Developer/Xcode/DerivedData/Tower-bkpdifuqssebjdgurzmtirbxejnn/Build/Intermediates/Tower.build/Debug/Tower.build/Objects-normal/x86_64/TWRAppDelegate.o, file too small for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

有人知道出了什么问题吗?


66
尝试进行完整的重建/清理。可能之前的构建异常中止,导致TWRAppDelegate.o 文件损坏或大小为零。 - Martin Baulig
5
一点澄清:您可以通过按下cmd+shift+k完成此操作,如果该方法不起作用,请进入派生数据文件夹并删除名为您的项目名称的文件夹。 - Ramy Al Zuhouri
3
现在不需要自己删除构建文件夹了。按住 Option 键,然后在“产品”菜单中选择“Clean”,它会变成“Clean Build Folder...”,可以为您执行此操作。 - Peter Hosey
@MartinBaulig 如果您将您的建议发布为答案,我会点赞并将其标记为被接受的答案。 - tbodt
2
@PeterK。这让我获得了“不错的问题”银徽章 :-) - tbodt
显示剩余5条评论
10个回答

212

借鉴 @martin-baulig 的回答:

尝试进行完整的重建/清理操作。可能是因为之前的构建过程异常中断,导致 TWRAppDelegate.o 文件损坏或者大小为零。


3
我的项目需要一段时间才能构建完成。如果您非正常停止构建,只需删除1-4个损坏的目标文件,而不是全部删除,就可以解决问题。请注意,不要修改原意。 - Fernando Mazzon
最好使用@grassyburrito的答案(只需向损坏的文件添加一个空格或其他内容);清理构建文件夹是多余的,可能会浪费大量时间。 - nrx
@nrx 我倾向于同意,但我曾经遇到过几个文件损坏的情况......而且在多次尝试编译之后才发现。根据您的项目规模,Martin的方法可能会更快。这个答案是在grassyburrito之前两年给出的 :-) - Peter K.

27

我通常会在需要的文件中添加一个空格(也可以是其他任何字符),然后将其删除并保存。 这比重新编译更加简单和快捷。


4
你的回答让我省了10分钟重建这个项目!谢谢。 - Accid Bright
1
这个答案应该排在第一位! - Ting Yi Shih
1
谢谢,亲切的陌生人!这是正确的答案。清理构建文件夹是显而易见且多余的。 - nrx

12
为了自动解决这个问题,可以添加“构建脚本阶段”,请前往Xcode -> 您的项目 -> 您的目标 -> 构建阶段 -> + -> 新建运行脚本阶段。将其重命名为“Xcode Link Fix”,并将其移动到“编译源”阶段之上。将以下内容粘贴到脚本主体中:
# Legacy build system
legacy_dir=`dirname "${LD_DEPENDENCY_INFO_FILE}"`
if [ -d "${legacy_dir}" ]; then
    find "${legacy_dir}" -size 0 | while read -d $'\n' file; do
        rm "$file"
    done
fi

# New build system
if [ -d "${OBJECT_FILE_DIR_normal}" ]; then
    find "${OBJECT_FILE_DIR_normal}" -size 0 | while read -d $'\n' file; do
        rm "$file"
    done
fi

此脚本检查大小为零的对象文件并将其删除,以便在下一步编译时成功。

如果您有多个应用程序目标,则需要为每个应用程序目标添加此脚本。

该脚本运行时间约为0.1秒,并可避免进行完整项目重建。


这太聪明了!每个项目都需要它。 - Nike Kov

9

rm -rf /Users/hostname/Library/Developer/Xcode/DerivedData

可以删除 Xcode 的衍生数据。

6

只需在终端应用程序中运行cmd即可删除此文件:

rm /Users/theodore/Library/Developer/Xcode/DerivedData/Tower-bkpdifuqssebjdgurzmtirbxejnn/Build/Intermediates/Tower.build/Debug/Tower.build/Objects-normal/x86_64/TWRAppDelegate.o


1
我用了同样的方法解决了它,比在我的大项目上进行完整的清理/构建要快得多。下次我会尝试@Anton Plebanovich的解决方案,这可能是自动化此修复的绝佳方式。 - Romano

3

不需要完全清除缓存的快速修复错误方法:

  1. 打开显示错误的文件(本问题中为 TWRAppDelegate
  2. 按下 cmd + A 键
  3. 按下 cmd + X 键
  4. 重新构建 - 失败
  5. 按下 cmd + V 键
  6. 重新构建 - 成功

1
你可以删除TWRAppDelegate.o文件并继续构建。将错误消息中提到的完整路径复制并粘贴到终端中的“rm”命令后面。无需清理/重建、删除派生数据、添加/删除项目中的文件等操作。

1

由于构建干净的项目可能需要太长时间,对于那些可以访问缓存中损坏文件的人来说,有更短的方法:

  • 删除该文件(移除引用)
  • 构建项目
  • 重新插入文件
  • 构建项目

完整版本以便您无法找到该文件:

  • 在Xcode项目导航器中查找该文件
  • 右键单击该文件并按“显示在查找器中”(在文件所在位置打开查找器)
  • 在Xcode中选择该文件,然后按退格键,然后单击“删除引用”
  • 构建项目(它将失败,但等待其完成)
  • 通过从查找器中将其拖到刚才删除的相同位置来重新插入文件
  • 构建项目(现在应该可以正常工作)

-1
一个干净的重建在我的情况下没有起作用,所以我解释一下如何解决这个问题:
- 删除文件的引用(不要删除文件)
- 再次将该文件添加到项目中并运行

负面投票需要解释,这对我有用,也可能对其他人有用。 - David Santiago

-1

步骤1. 进入:项目 > 构建设置 > 搜索路径

步骤2. 将“始终搜索用户路径”设置为是

步骤3. 构建项目(您将收到警告,但项目将构建。)

步骤4. 将“始终搜索用户路径”设置回否,再次构建以消除警告


可以为其他发现这个答案的人添加这个。"始终搜索用户路径"已在Xcode 8.3中被弃用,并且从文档中也可以看到"强烈建议禁用它"(即将其设置为NO)。 - Groot

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