Xcode构build失败“架构x86_64的未定义符号”
一个Xcode初学者的问题:
这是我第一次使用Xcode 4.6.3的经验。
我想写一个非常简单的控制台程序,search配对的BT设备,并打印到NSLog。
它build立与以下错误:
Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_IOBluetoothDevice", referenced from: objc-class-ref in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
我疯狂search。 常见的问题应该是一个文件的引用,其中只有头文件被导入,链接器找不到实现(* .m-file)。 然而,IOBluetooth库是像Foundation Framework这样的标准框架。
我在上面的陈述中错过了什么?
我也试着build立一个32位机器(构build失败了)。 这显然是一个链接器的错误,但是我不知道,它涉及什么,除了有一个问题,findIOBluetoothDevice的实现,在x86和x64架构,而头文件是从一个标准的包含框架,被称为IOBluetooth?
为了您的信息我的主要代码“main.m”是:
#import <Foundation/Foundation.h> #import <IOBluetooth/objc/IOBluetoothDevice.h> // Note the import for bluetooth #import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h> // Note the import for bluetooth int main(int argc, const char * argv[]) { @autoreleasepool { IOBluetoothDevice *currentDevice; NSArray *devices = [ IOBluetoothDevice pairedDevices]; for (id currentDevice in devices){ NSLog(@"%i : %@",[ currentDevice classOfDevice ], [ currentDevice name ]); } } return 0; }
感谢任何帮助或指向正确的方向。
它看起来像你缺less,包括项目中的IOBluetooth.framework。 你可以添加它:
– 点击左侧窗格左上方的项目(蓝色图标)。
在中间窗格中,单击“构build阶段”选项卡。
– 在“与库链接二进制文件”下,单击加号button。
从列表中findIOBluetooth.framework并点击Add。
这将确保链接器findIOBluetooth.framework定义。 您可以通过单击左侧窗格中的框架并在右侧窗格中查看框架的目标成员来看到框架是您的目标的成员(请注意,为了组织目的,我已将框架移动到了框架组下):
UPD
苹果要求使用arm64架构。 不要在您的项目中使用x32库
所以下面的答案是不正确的了!
老答案
新的Xcode 5.1将架构armv7,armv7s和arm64设置为默认值。
有时,错误“构build失败”可能是由于x86_64“”结构的未定义符号造成的。 因为,有些库(不是苹果的)最初是为x32编译的,不支持x64。
所以你需要的是像这样改变你的项目目标的“架构”
NB。 如果你使用的是Cocoapods,你应该为“Pods”目标做同样的事情。
体系结构x86_64的未定义符号:“_OBJC_CLASS _ $ _ xxx”,引用来自:yyy.o中的objc-class-ref
这通常意味着,您从类“yyy”调用“xxx”(可能是框架或类)。 编译器不能find“xxx”,所以这个错误发生。
您需要通过在导航窗口中右键单击您的项目文件夹来添加缺less的文件(在本例中为“xxx”),然后点击“ 添加文件到” YourProjectName “ ”选项。
一个popup窗口将在Finder中打开你的项目文件。 在那里,你可以看到丢失的文件,只是将它们添加到您的项目。 不要忘记检查“ 如果需要复制项目 ”框。 祝你好运!!
我也看到了Xcode 7.2上的这个错误,当派生的数据被破坏(在我的情况下,我打断了一个构build,并怀疑这是根本原因)。
因此,如果其他解决scheme(特别是Chris和BraveS,我怀疑它更可能)不适合您的问题,请尝试删除派生数据(select:Window / Projects / Derived Data – > Delete)并重新构build。
(添加供别人参考 – 我知道原来的问题已被正确回答)。
我也遇到了同样的问题,上面的方法是行不通的。 我不小心删除了以下目录中的文件。
要么
〜/资源库/开发/ Xcode中/ DerivedData /
在Xcode 9.0b5下,你可能会遇到这个问题,因为Xcode 9.0b5有一个bug,当你添加源代码时,它不符合目标设置。 你必须进入后手动设置每个文件的目标:
在我的情况下,这不是一个图书馆,这是一些类。
架构x86_64的未定义符号:
“_OBJC_CLASS _ $ _ ClassNmae”,引用自:SomeClassName中的objc-class-ref“。d:架构x86_64中找不到符号
铿锵声:错误:链接器命令失败,退出代码1(使用-v来查看调用)
解决scheme我有几个目标在Xcode与几个模式(生产,开发等)..我的一些新添加的实现(Class.m)失踪
Xcode->目标 – >构build阶段 – >编译源
所以我不得不手动添加它们。
那么我可以编译和build立成功。
我发现这也可能发生,如果您拖动一个文件夹与Objective-C文件到您的项目。 如果该文件夹出现蓝色,我认为这表明它没有正确的链接。 你可以validation这一点(如果你使用版本控制),因为每当你添加新文件的时候,pbxproj文件应该更新到那些新文件的链接。 但是,您可能会发现,添加一个文件夹后,pbxproj文件没有更改(因此存在链接错误)。 所以你会得到自动完成的工作,它会find你导入的类,但是当它去实际构build图像失败,这个错误代码。
解决scheme是不添加文件夹,而是添加文件。 做到这一点,你应该看到pbxproj文件更新,它应该修复这个错误。
这也假定你已经完成了上面所build议的内容,并正确链接了所有正确的框架。
当更新到Xcode 7.1时,您可能会看到这种types的错误,并且无法通过上述任何答案来解决。 在我的情况下,其中一个症状是该应用程序不在模拟器中运行在设备上。 你可能会看到大量与你正在使用的框架几乎相关的错误。
修复其实很简单。 您只需要从“框架searchpath”设置中删除一个条目,在您的目标>构build设置>searchpath部分中find(确保选中“全部”选项卡)
如果你在这里看到另外一个条目(除了$(inheritance)),你只需从所有目标中删除错误的path并重build。
我有同样的错误,因为而不是删除一个文件,我只是删除对它的引用。 在Finder中find文件并删除它有帮助。
我尝试了几乎所有的东西,但是我的问题竟然是以前的cocoapods构build的残余。 对我有效的是:
-
rm -Rf Pods; pod install
- 删除派生数据(窗口/项目…select您的目标,单击删除button)
- 重build
如果在尝试链接到C文件时遇到此错误,请首先仔细检查错误的函数名称。 接下来再检查一下,你是不是试图从C ++ / Objective-C ++环境中调用C函数而不使用extern C {}
结构。 我正在把头发撕掉,因为我有一个在.mm文件中试图调用C函数的类。 它不起作用,因为在C ++中,符号被破坏。 您实际上可以看到使用nm工具生成的具体符号。 terminal到.o文件的path,然后在调用符号的文件和应该有符号的文件上运行nm -g
,你应该看看它们是否匹配,这可以提供错误的线索。
nm -g file.o
你可以检查用这个去掉的C ++符号:
nm -gC file.o
对我来说,合并冲突之后就开始了。
我试图清理和删除生成文件夹,但没有一个帮助。 无论如何这个问题一直在发 然后,我通过删除有问题的组并重新添加到项目中并重新引用了该引用。
也可以是您要编译的.c文件中的#include <windows.h>
。