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

时间:2017-06-26 17:36:31

标签: ios xcode linker-errors tvos lto

我正在为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)。

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

1 个答案:

答案 0 :(得分:0)

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

所以我决定在项目中尝试启用 LTO。 LLVM_LTO=YES_THIN的行为与LLVM_LTO=NO相同。 LLVM_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,并且链接器没有抱怨该库中的任何对象,它们是为错误构建的目标平台。另外file1file2等也不会出现在otool -l libproblematic.a的输出中。