1

我正在为 tvOS 构建一个项目(如果它很重要,目标是一个框架)并从链接器获取错误:

ld:为 tvOS 构建,但在为 iOS 构建的目标文件中链接,用于架构 arm64

我跑otool -l *.o进去OBJECTS_FILE_DIR_normal发现其中一个 .o 文件实际上是为 iOS 而不是 tvOS 构建的。

问题是该 .o 没有对应的源文件(*.mm 或 *.cpp)。它被调用<ProjectName>_lto.o,我在构建日志中看不到该文件的任何编译器调用。它在链接器命令行中只出现一次:

-Xlinker -object_path_lto -Xlinker /Full/path/to/<ProjectName>.build/Debug-appletvos/tvOS.build/Objects-normal/arm64/<ProjectName>_lto.o

LLVM_LTO构建设置没有明确设置,但默认为NO. 将其设置为NO明确没有帮助。

我正在使用 Xcode 8.3.2 (8E2002)。

所以我的问题是:为什么要创建这个目标文件,为什么要为错误的目标平台创建它?

4

1 回答 1

0

不确定这是否应该是我自己的问题或编辑的答案,因为它没有回答原始问题“为什么会为错误的拱门生成 _lto.o 文件LLVM_LTO=NO”,但它可能有助于其他人解决这个问题.

所以我决定尝试在项目中启用LTO。LLVM_LTO=YES_THIN行为与 相同LLVM_LTO=NOLLVM_LTO=YES使链接器产生大量警告,如下所示:

ld: warning: Linking two modules of different target triples: /path/to/one/of/3rdpary/libs/libproblematic.a(file1.o)' is 'arm64-apple-ios7.0.0' whereas 'ld-temp.o' is 'arm64-apple-tvos9.0.0'
ld: warning: Linking two modules of different target triples: /path/to/one/of/3rdpary/libs/libproblematic.a(file2.o)' is 'arm64-apple-ios7.0.0' whereas 'ld-temp.o' is 'arm64-apple-tvos9.0.0'

但是由于某些奇怪的原因,所有这些警告都成功了。有趣的是,如果我运行otool -l libproblematic.a,我只看到cmd LC_VERSION_MIN_TVOS行,没有cmd LC_VERSION_MIN_IPHONEOS,并且链接器没有抱怨该库中的任何对象,它们是为错误的目标平台构建的。此外file1,file2等不会出现在 的输出中otool -l libproblematic.a

于 2017-06-26T20:59:18.497 回答