Xcode初学者的问题:
这是我第一次使用Xcode 4.6.3。
我正在尝试编写一个非常简单的控制台程序,搜索配对的BT设备并将它们打印到NSLog。
它构建时出现以下错误:
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)
我疯狂地搜索过。常见问题应该是对文件的引用,其中只导入头文件,链接器不会找到实现(* .m-file)。然而,IOBluetooth库是一个标准的框架,如Foundation Framework。
我在上述陈述中缺少什么?
我也尝试过为32位机器构建它(再次构建失败)。这显然是链接器错误,但是我不知道它与它有什么关系,除了在x86和x64架构上找到IOBluetoothDevice的实现存在问题,而头文件来自标准包含的Framework,称为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;
}
感谢您提供任何帮助或指向正确的方向。
答案 0 :(得分:109)
您的项目中似乎缺少IOBluetooth.framework。您可以通过以下方式添加:
- 点击左侧窗格左上角的项目(蓝色图标)。
- 在中间窗格中,单击“构建阶段”选项卡。
- 在“Link Binary With Libraries”下,单击加号按钮。
- 从列表中找到IOBluetooth.framework并点击Add。
这将确保链接器找到IOBluetooth.framework定义。通过单击左窗格中的框架并在右窗格中查看框架的目标成员资格,您可以看到框架是目标的成员(注意我已将Frameworks组下的框架移动到组织目的):
答案 1 :(得分:48)
<强> UPD 强>
Apple 要求使用 arm64 架构。不要在项目中使用x32库
所以下面的答案不再正确了!
旧答案
新的Xcode 5.1将架构armv7,armv7s和 arm64 设置为默认值。
有时错误“构建失败”架构x86_64“”的未定义符号可能由此引起。因为,一些libs(不是Apple的)最初是为x32编译的,不支持x64。
所以你需要的是像你这样改变你的项目目标的“架构”
NB。如果你正在使用Cocoapods - 你应该为“Pods”目标做同样的事情。
答案 2 :(得分:25)
架构x86_64的未定义符号:“_ OBJC_CLASS _ $ _ xxx”, 引自: yyy.o中的objc-class-ref
这通常意味着,您从“yyy”类调用“xxx”(可能是框架或类)。编译器无法找到“xxx”,因此会发生此错误。
您需要在导航窗口中右键单击项目文件夹,然后点击“将文件添加到 YourProjectName ”> 强>“选项。
弹出窗口将在Finder中打开您的项目文件。在那里,您可以看到丢失的文件,只需将它们添加到您的项目中即可。不要忘记查看“复制项目,如果需要”框。祝你好运!!
答案 3 :(得分:16)
当衍生数据损坏时,我也在Xcode 7.2上看到了这个错误(在我的情况下,我打断了构建并怀疑是根本原因)。
因此,如果其他解决方案(尤其是我怀疑更可能是Chris和BraveS)不适合您的问题,请尝试删除派生数据(选择:窗口/项目/派生数据 - >删除)并重新构建。
(添加供其他人参考 - 我知道原始问题已得到正确回答)。
答案 4 :(得分:12)
在我的案例中,它不是一个库,而是一些类..
架构x86_64的未定义符号:
“_OBJC_CLASS _ $ _ ClassNmae”,引自:objc-class-ref in SomeClassName“...d:找不到架构x86_64的符号
clang:错误:链接器命令失败,退出代码为1(使用-v查看 调用)
<强>解决方案强> 我在Xcode中有几个目标,有几个模式(生产,开发等)。我新增了一些实现(Class.m)
Xcode-&gt;目标 - &gt;构建阶段 - &gt;编译源
所以我不得不手动添加它们。
然后我可以编译&amp;建立成功。答案 5 :(得分:12)
答案 6 :(得分:8)
答案 7 :(得分:5)
更新到Xcode 7.1时,您可能会看到此类错误,并且无法通过上述任何答案解决。在我的情况下,其中一个症状是应用程序在设备上运行而不是在模拟器中运行。您可能会看到与您正在使用的几乎所有框架相关的大量错误。
修复实际上非常简单。您只需要从“目标搜索路径”设置中删除条目,该设置可在您的目标&gt;中找到。构建设置&gt; “搜索路径”部分(确保选中“全部”选项卡)
如果您在主目标或测试目标中看到此处的另一个条目(除$(继承)之外),只需从所有目标中删除错误路径并重建。
答案 8 :(得分:4)
我发现如果将带有Objective-C文件的文件夹拖到项目中,也会发生这种情况。如果该文件夹显示为蓝色,我认为它表明它没有正确链接。您可以验证这一点(如果您使用版本控制),因为无论何时添加新文件,pbxproj文件都应该更新,并附带指向这些新文件的链接。但是,您可能会发现在添加文件夹后pbxproj文件没有更改(因此存在链接错误)。因此,您将获得自动完成工作,它将找到您导入的类,但是当它实际构建图像时,它将失败并显示此错误代码。
解决方案是不添加文件夹,而是添加文件。这样做,您应该看到pbxproj文件更新,它应该修复此错误。
这也假设您已完成上述建议,并正确链接了所有正确的框架。
答案 9 :(得分:4)
我在这里尝试了一切,但我的问题原来是以前cocoapods构建的遗留物。对我有用的是:
rm -Rf Pods; pod install
答案 10 :(得分:3)
我有同样的错误,因为我只是删除了对它的引用,而不是删除文件。在Finder中找到文件并删除它有帮助。
答案 11 :(得分:2)
就我而言,问题是编译后的框架体系结构。
我正在运行 Xcode 11 ,并使用 Swift 5.1
尝试运行测试,但MyAppFrameWork产品已针对通用iOS设备进行编译,并且测试目标需要使用x86-64臂,因此我为iOS模拟器重建了框架,并成功开始运行测试用例。
答案 12 :(得分:1)
就我而言,我构建了一个自定义框架,部署目标设置为9.1,但我的应用程序的部署目标较低,支持8.1。最小化自定义框架部署目标解决了我的问题。
答案 13 :(得分:1)
帮助我的是在抛出错误的项目中将 s.static_framework = true
添加到我的 /podspec
。
答案 14 :(得分:1)
答案 15 :(得分:1)
我参加聚会很晚,但想到了再分享一个可能发生这种情况的场景。 我正在研究一个框架,并通过可可豆分配它。 该框架具有目标c和快速的类和协议,并且正在成功构建。 在其他框架或项目中使用pod时,由于我忘记在podspec中包括.m文件,因此出现了此错误。 请在您的podspec来源中包括.swtift,.h和.m文件,如下所示: s.source_files =“项目名称/项目名称/ ** / *。{swift,h,m}”
我希望它可以节省别人的时间。
答案 16 :(得分:1)
我知道这是一个古老的问题,但今天遇到了同样的错误,并且没有上述解决方案有效。
通过设置选项
修复了它Project -> Architecture -> Build Active Architecture Only
到是
和项目编译和构建正确
答案 17 :(得分:1)
如果您在尝试链接到C文件时遇到此错误,请首先仔细检查拼写错误的函数名称。接下来仔细检查您是否在不使用extern C {}
构造的情况下尝试从C ++ / Objective-C ++环境调用C函数。我正在撕扯我的头发,因为我有一个类在.mm文件中试图调用C函数。它不起作用,因为在C ++中,符号被破坏了。您实际上可以看到使用nm工具生成的具体符号。终端到.o文件的路径,并在调用符号的文件和应该有符号的文件上运行nm -g
,你应该看看它们是否匹配,这可以提供线索错误。
nm -g file.o
您可以使用以下方法检查解压缩的C ++符号:
nm -gC file.o
答案 18 :(得分:0)
就我而言,我必须添加
target 'SomeTargetTests' do
inherit! :search_paths
end
到我的podfile,然后删除/ Pods目录并运行`pod install`
(Xcode 10.1)
答案 19 :(得分:0)
这可能会对某人有所帮助。我花了几天的时间才终于弄清楚。我在OBJ-C中工作,然后去了:
Project
-> Build Phases
-> Compile sources
,并添加了我刚刚添加的新VC.m
文件。
我正在使用遗留代码,通常对于OBJ-C来说是新手,所以我什至没有想到将.m
文件导入到源库中。
编辑:
第二次遇到这个问题,这是另外一回事。经过5个小时的调试,此答案为我节省了很多。尝试了该线程上的所有选项以及更多。 https://stackoverflow.com/a/13625967/7842175如果这可以帮助您,请给他功劳,但基本上,您可能需要在文件检查器中将文件设置为其目标。
总而言之,这是一个非常模糊的错误代码,可能由于多种原因而引起,因此请继续尝试其他选项。
答案 20 :(得分:0)
有时候,我忘记了从Release-universal复制库,而错误地从Release-iphoneos复制。通常,Release-iphoneos包含已为X86修剪的.a文件。这样就给出了错误。
答案 21 :(得分:0)
我已经多次面对这个问题。通常在删除构建文件夹时会出现这种情况。
简单的解决方案是重新集成并安装Pod文件。
pod deintegrate
pod install
答案 22 :(得分:0)
我通过在“构建设置”的“其他链接器标志”中添加“ -lc ++”解决了该问题。
答案 23 :(得分:0)
就我而言,删除目标成员资格的选择,然后再次选择,以解决此问题。
用附件照片检查William Cerniuk的答案。
答案 24 :(得分:0)
也可能是您尝试编译的.c文件中的#include <windows.h>
。
答案 25 :(得分:0)
对我而言,这种情况在合并冲突后开始发生。
我尝试清理并删除了build文件夹,但没有一个帮助。这个问题一直在发生。然后我重新链接了引用,删除了有问题的组并重新添加到项目中并且它有效。
答案 26 :(得分:0)
就我而言,我收到此错误:体系结构 x86_64 的未定义符号:“_OBJC_CLASS _ $ _ RCTImageLoader”
我能够通过在我的 Podfile 文件中添加以下行来修复它:
pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image'
答案 27 :(得分:0)
我在使用 CocoaPods
时遇到了这个问题,但有一些没有特定版本的依赖项,这就是为什么在 pod update
之后它下载了包含一些重大更改的最新版本
Derived Data
[About] 文件夹答案 28 :(得分:0)
当您在当前项目中使用架构 arm6、arm7 但您尝试在项目中使用的任何 3rd 方框架都是基于 x86_64 构建时,就会发生这种情况。
例如,如果您在项目中使用 Cocoa Pods,那么您需要添加以下脚本以确保所有 3rd 方框架都确保 arm6、arm7。即
带有要在末尾添加的脚本的示例 podfile
target 'XYZ_ProjectTarget' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for XYZ_ProjectTarget
pod 'pod_name'
target 'XYZ_TargetTests' do
inherit! :search_paths
# Pods for testing
end
target 'XYZ_TargetUITests' do
# Pods for testing
end
end
post_install do |installer_representation|
installer_representation.project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['ARCHS'] = 'armv7 armv7s'
end
end
end