为什么我会遇到这个特殊的 Mach-O 链接器问题?

Why am I getting this particular Mach-O linker problem?

提问人:Tom 提问时间:7/26/2019 最后编辑:Ken ThomasesTom 更新时间:7/27/2019 访问量:45

问:

我已经查看了 SO 上的所有 Mach-0 Linker 问题,但找不到任何似乎特定于我的问题的问题。我的应用程序在调试器中编译了数周没有问题,这似乎是出乎意料的。问题似乎指向两个源文件(keypad.o 和 setoutput.o)。以前的 Mach-O 错误通常告诉我,某某不能从“某个文件”.o 中引用,但在这种情况下没有这么简单的线索。错误如下所示:

ld "/Users/Administrator/Library/Developer/Xcode/DerivedData/MacOS_Cover-aemdqkcjvuomtjfhkycsyowsgisn/Build/Products/Debug/MacOS Cover.app/Contents/MacOS/MacOS Cover" normal x86_64
cd "/Users/Administrator/Desktop/MacOS Cover"
setenv MACOSX_DEPLOYMENT_TARGET 10.6
/Developer/usr/bin/clang -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk -L/Users Administrator/Library/Developer/Xcode/DerivedData/MacOS_Cover-aemdqkcjvuomtjfhkycsyowsgisn/Build/Products/Debug -F/Users/Administrator/Library/Developer/Xcode/DerivedData/MacOS_Cover-aemdqkcjvuomtjfhkycsyowsgisn/Build/Products/Debug -filelist "/Users/Administrator/Library/Developer/Xcode/DerivedData/MacOS_Cover-aemdqkcjvuomtjfhkycsyowsgisn/Build/Intermediates/MacOS Cover.build/Debug/MacOS Cover.build/Objects-normal/x86_64/MacOS Cover.LinkFileList" -mmacosx-version-min=10.6 -framework Cocoa -o "/Users/Administrator/Library/Developer/Xcode/DerivedData/MacOS_Cover-aemdqkcjvuomtjfhkycsyowsgisn/Build/Products/Debug/MacOS Cover.app/Contents/MacOS/MacOS Cover"

ld: duplicate symbol _required in /Users/Administrator/Library/Developer/Xcode/DerivedData/MacOS_Cover-aemdqkcjvuomtjfhkycsyowsgisn/Build/Intermediates/MacOS Cover.build/Debug/MacOS Cover.build/Objects-normal/x86_64/keypad.o and /Users/Administrator/Library/Developer/Xcode/DerivedData/MacOS_Cover-aemdqkcjvuomtjfhkycsyowsgisn/Build/Intermediates/MacOS Cover.build/Debug/MacOS Cover.build/Objects-normal/x86_64/setoutput.o for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Command /Developer/usr/bin/clang failed with exit code 1

我试过扔掉所有派生的数据文件等(似乎在一秒钟后弹回来)。如果有人能帮我解决这个问题,我将不胜感激。

Objective-C Xcode 链接器错误

评论


答:

1赞 Ken Thomases 7/27/2019 #1

这两个目标文件各自导出一个具有相同名称的符号(;下划线是编译器的产物)。根据你对这两者的确切意图,你可能需要:a)重命名一个或两个;或 b) 使一个或两个具有内部链接,通常通过标记它们。requiredstatic

您很有可能认为只有一个这样的符号,因为您在两个源文件都包含的标头中声明了它。但是,您可能无意中在标题中定义了符号,而不仅仅是声明它。然后,在包含它的每个源文件中定义它。您必须显示您的源代码以及它的声明/定义以及如何将其引入每个源文件。required

评论

1赞 Ted Wrigley 7/27/2019
static如果要将其保留在特定文件的本地位置; 如果要声明全局变量...extern
0赞 Ken Thomases 7/27/2019
extern基本上什么都不做。如果不是,那么问题在于它是一个声明还是一个定义。对于变量,如果它有一个初始值设定项,它就是一个定义。对于一个函数,如果它有一个主体,它就是一个定义。static
0赞 Ted Wrigley 7/27/2019
是的,但是通过使用 extern 全局声明并在本地的某个地方定义它,我们避免了“重复符号”错误。这取决于您将如何使用该符号。我经常设置一堆外部定义的常量,我可以将它们导入到项目中(减少代码蔓延......
0赞 Tom 7/28/2019
@Ken托马斯。现在工作正常,谢谢!由于 Mach-O 错误中显示了大量信息,我发现它们非常令人生畏(我患有 MachOphobia),但您现在的清晰解释使它们更容易理解。由于我不幸选择了变量名称“required”,我自欺欺人地认为提到的特定文件需要一些我忽略的额外内容。感谢您对我的知识的补充。