Xcode构建失败“架构x86_64未定义符号”;

一个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库是一个标准框架,就像基础框架一样。

我在上面的陈述中遗漏了什么?

我还尝试为32位机器构建它(构建再次失败)。这显然是一个链接器错误,但我不知道,它与什么有关,除了有一个问题,找到IOBluetoothDevice的实现,在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;
}

谢谢你的任何帮助或指点正确的方向。

495031 次浏览

看起来您在项目中缺少包含ioblutooth .framework。您可以通过以下方式添加:

  • 单击左窗格左上方的项目(蓝色图标)。

  • 在中间窗格中,单击Build Phases选项卡。

  • 在“Link Binary With libraries”下,点击加号按钮。

  • 从列表中找到ioblutooth .framework,然后点击Add。

enter image description here

enter image description here

这将确保ioblutooth .framework定义被链接器找到。您可以通过单击左侧窗格中的框架,并在右侧窗格中看到该框架的目标成员,从而看到该框架是目标成员(注意,出于组织目的,我已经将该框架移动到Frameworks组下):

enter image description here

乌利希期刊指南

Apple 需要使用arm64架构。在项目中不使用x32库

所以下面的答案不再正确了!


旧的答案

新的Xcode 5.1将架构armv7、armv7s和arm64设置为默认值。

有时错误架构x86_64的未定义符号"可能是由此引起的。因为,一些库(不是苹果的)最初是为x32编译的,不支持x64。

所以你所需要的,就是像这样改变你的项目目标的“架构”

NB。如果你正在使用Cocoapods -你应该为“Pods”目标做同样的事情。

enter image description here

当更新到Xcode 7.1时,你可能会看到这种类型的错误,它不能通过上述任何答案来解决。在我的案例中,其中一个症状是应用程序在设备上而不是在模拟器中运行。您可能会看到大量与您正在使用的几乎所有框架相关的错误。

解决方法其实很简单。你只需要从“框架搜索路径”设置中删除一个条目,在你的TARGETS > Build Settings > Search Paths部分中找到(确保“All”选项卡被选中)

enter image description here

如果您在这里看到主目标或测试目标的另一个条目(除了$(inherited)之外),只需从所有目标中删除错误路径并重新构建。

未定义的符号建筑x86_64: "_OBJC_CLASS_$_xxx", 引用: Objc-class-ref in yyy.o

这通常意味着,您从类“yyy”中调用“xxx”(它可能是一个框架或类)。编译器无法定位“xxx”,因此出现此错误。

你需要添加丢失的文件(在本例中是“xxx”),右键单击导航器窗口中的项目文件夹,然后点击“添加文件到"YourProjectName"”选项。

一个弹出窗口将打开Finder中的项目文件。在那里,您可以看到丢失的文件,并将它们添加到您的项目中。不要忘记勾选“如有需要,复制项目”框。祝你好运! !

我也在Xcode 7.2上看到过这个错误,当派生数据被损坏时(在我的情况下,我中断了一个构建,怀疑这是根本原因)。

因此,如果其他解决方案(特别是克里斯的和BraveS的,我怀疑更有可能)不适合你的问题,尝试删除派生数据(选择:窗口/项目/派生数据->删除)并重新构建。

(补充供他人参考-我知道原来的问题已经正确回答)。

我也犯了同样的错误,因为我没有删除文件,而是删除了对该文件的引用。在Finder中定位文件并删除它会有所帮助。

我也遇到了同样的问题,上面的方法都行不通。我不小心删除了下面目录下的文件。 enter image description here < / p >

~ /图书馆/开发/ Xcode / DerivedData /

enter image description here

我发现,如果您将包含Objective-C文件的文件夹拖到项目中,也会发生这种情况。如果该文件夹显示蓝色,我认为这表明它没有正确链接。您可以验证这一点(如果使用版本控制),因为每当您添加新文件时,pbxproj文件都应该更新到这些新文件的链接。但是,您可能会发现在添加了一个文件夹之后,pbxproj文件没有更改(因此存在链接错误)。你会让自动完成工作,它会找到你导入的类,但当它真正构建映像时,它会失败,有这个错误代码。

解决方案是不添加文件夹,而是添加文件。这样做,您应该会看到pbxproj文件更新,它应该会修复这个错误。

这还假定您已经完成了上面建议的操作,并正确链接了所有正确的框架。

对我来说,不是图书馆,而是一些课程。

架构x86_64的未定义符号:
"_OBJC_CLASS_$_ClassNmae",引用自:objc-class-ref in SomeClassName”…< / p >

D:没有找到架构x86_64的符号

clang: error: linker command failed with exit code 1(使用-v查看 调用)< / p >

<强>解决方案 我在Xcode中有几个目标和几个模式(生产,开发等)。我的一些新添加的实现(类。M)

Xcode->目标->构建阶段->编译源代码

所以我必须手动添加它们。

然后我就可以编译&构建成功。

我在这里尝试了几乎所有的东西,但我的问题原来是以前的cocoapods构建的残余。对我有用的是:

  1. rm -Rf Pods; pod install
  2. 删除派生数据(窗口/项目…选择你的目标。点击删除按钮)
  3. 重建

如果在尝试链接到C文件时遇到此错误,首先要仔细检查函数名是否有错别字。接下来,再次检查是否试图在不使用extern C {}构造的情况下从c++ / objective - c++环境中调用C函数。我很抓狂,因为我在。mm文件中有一个类,它试图调用C函数。它不能工作,因为在c++中,符号是混乱的。实际上,您可以看到使用nm工具生成的具体符号。终端到.o文件的路径,并在调用该符号的文件和应该具有该符号的文件上运行nm -g,您应该看到它们是否匹配,这可以为错误提供线索。

nm -g file.o

你可以这样检查c++符号:

nm -gC file.o

对我来说,这是在合并冲突之后开始发生的。

我试图清理和删除构建文件夹,但没有帮助。不管怎样,这个问题一直在发生。然后,我通过删除有问题的组来重新链接引用,并重新添加到项目中,它起作用了。

也可以是你试图编译的.c文件中的#include <windows.h>

在Xcode 9.0b5中,你可能会遇到这种情况,因为Xcode 9.0b5有一个bug,当你添加源代码时,它不遵守目标设置。你必须在后面手动设置每个文件的目标:

Xcode项目与手动目标成员插图

在我的例子中,我构建了一个自定义框架,部署目标设置为9.1,但我的应用程序的部署目标更低,它支持8.1。最小化自定义框架部署目标解决了我的问题。

我知道这是一个老问题,但今天得到了同样的错误,上述解决方案都无效。

通过设置选项来修复它:

Project -> Architecture -> Build Active Architecture Only

为Yes

正确地编译和构建项目

我来派对晚了,但我想再分享一个可能发生这种情况的场景。 我正在研究一个框架,并将其分布在可可足类动物上。 该框架同时包含objective c和swift类和协议,并成功构建。 当在另一个框架或项目中使用pod时,它给出了这个错误,因为我忘记在podspec中包含.m文件。 请将.swtift,.h和.m文件包含在您的podspec源代码中,如下所示: s.source_files = " Projectname / Projectname / * * / *。{迅速,h, m}”< / p >

我希望这能节省别人的时间。

在我的情况下,我必须加上

    target 'SomeTargetTests' do
inherit! :search_paths
end
到我的podfile,然后删除/Pods目录,并运行' pod install '

(Xcode 10.1)

这可能会帮助到某些人。我花了好几天才想明白。我在OBJ-C工作,我去了:

Project -> Build Phases -> Compile sources,并添加了我刚刚添加的新VC.m文件。

我正在使用遗留代码,我通常是一个敏捷的,新的OBJ-C,所以我甚至没有想过将我的.m文件导入源代码库。

编辑:

第二次遇到这个问题,结果就不一样了。这个答案在5个小时的调试之后拯救了我。尝试了这个线程上的所有选项。https://stackoverflow.com/a/13625967/7842175请给他信用,如果这对你有帮助,但基本上你可能需要在文件检查器中设置你的文件到它的目标。

这是你的文件检查器,只是确保所有你需要的目标是 < / >

总而言之,这是一个非常模糊的错误代码,可能是由很多原因引起的,所以继续尝试不同的选项。

有时,我忘记从Release-universal复制库,并错误地从Release-iphoneos复制。通常Release-iphoneos包含。a文件,该文件已为X86裁剪。所以它给出了误差。

这个问题我已经遇到过很多次了。这通常发生在您删除构建文件夹时。

简单的解决方案是解集成并重新安装pod文件。

pod deintegrate
pod install

我通过在构建设置中的其他链接器标志中添加“-lc++”来解决这个问题。

在我的例子中,目标成员的取消选择,然后再次选择修复问题。

查看William Cerniuk的答案和附件照片。

在我的案例中,问题是编译框架架构 我正在运行Xcode 11并使用斯威夫特5.1

  • 我有三个目标:
    • MyApp
    • MyAppTests
    • MyAppFrameWork
    • 李< / ul > < / >

    我试图运行测试,但MyAppFrameWork产品是为通用iOS设备编译的,测试目标需要一个arm x86-64,所以我重新构建了iOS模拟器和测试用例成功开始运行的框架。

帮助我的是在抛出错误的项目中将s.static_framework = true添加到我的/podspec中。

在我的情况下,我得到这个错误:架构x86_64的未定义符号:"_OBJC_CLASS _ $ _ RCTImageLoader"

我能够通过在Podfile文件中添加以下一行来修复它:

pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image'

参考

架构x86_64的未定义符号

我在使用CocoaPods和一些没有特定版本的依赖时运行了这个问题,这就是为什么在pod update之后它下载了最新版本,其中包括一些破坏性的变化

  • 升级依赖项和使用它们的代码
  • 设置pod的具体版本
  • 删除Derived Data<一口>[对]< /一口>文件夹

当你在你当前的项目中使用arm6、arm7架构时,任何你试图在你的项目中使用的第三方框架都是基于x86_64构建的。

例如,如果你在你的项目中使用Cocoa Pods,那么你需要添加以下脚本,以确保所有第三方框架都能确保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

这也发生在苹果M1芯片上。

这是我的解决方案,只需检查打开使用Rosetta enter image description here 步骤:< / p >

  1. 转到应用>右键点击xcode >获取信息>检查使用Rosetta打开
  2. 重新启动系统。