Xcode构建失败“体系结构x86_64的未定义符号”


168

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文件)。但是,IOBluetooth库是一个类似于Foundation框架的标准框架。

我在上述声明中缺少什么?

我也尝试过为32位计算机构建它(构建再次失败)。显然这是一个链接器错误,但是我不知道它与它之间的关系,除了在x86和x64体系结构上查找IOBluetoothDevice的实现存在问题之外,而头文件来自一个包含在标准中的Framework(称为IO蓝牙?

供您参考,我的主要代码“ 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;
}

感谢您的帮助或指向正确方向的指点。


17
尝试添加$(inherited)其他链接器标志,清理并构建。
Resty

1
遇到此问题时,我发现必须去File Inspector中查找m文件,然后选中“ Target Membership”下的框,以将其导出(?)到我尝试使用它的模块中。
Landon Kuhn

Answers:


123

您的项目中似乎缺少IOBluetooth.framework。您可以通过以下方式添加它:

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

-在中间窗格中,单击“构建阶段”选项卡。

-在“使用库链接二进制文件”下,单击加号按钮。

-从列表中找到IOBluetooth.framework,然后单击“添加”。

在此处输入图片说明

在此处输入图片说明

这将确保链接器找到IOBluetooth.framework定义。通过单击左窗格中的框架并在右窗格中查看该框架的目标成员身份,可以看到该框架是目标的成员(请注意,出于组织目的,我已将该框架移至“框架”组下):

在此处输入图片说明


3
有效!也非常感谢您努力拍摄一些屏幕截图!
RisingSun

同样的事情对于oAuthIOS框​​架也可以正常工作。将oAuthIOS框​​架从pods文件夹添加到您要构建的根项目中
prodeveloper 2014年

1
我正在搜索IOBluetooth.framework,但不存在:S
Menno van der Krift

奇怪,应该在那里。
克里斯·里夫达尔2015年

太棒了!救了我几个小时!
Bravo Kevin

49

UPD

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

因此,下面的答案不再正确!


旧答案

新的Xcode 5.1将体系结构armv7,armv7s和arm64设置为默认值。

有时可能是由于此错误引起的“构建失败“体系结构x86_64的未定义符号”。因为,某些库(不是Apple的)最初是为x32编译的,不支持x64。

因此,您需要像这样更改项目目标的“架构”

注意 如果您使用的是Cocoapods,则应该对“ Pods”目标执行相同的操作。

在此处输入图片说明


3
基本上,我从“有效体系结构”属性中删除了arm64thing。然后,如上所示,将只能查看我猜想的有效架构中的内容!
Randika Vishman

@Vishman,嗨!有一个很好的SO答案,涵盖了Valid Architectures和之间的区别Architectures
Aleksey Potapov

修复了我尝试在iOS 7.1模拟器中运行项目时在Xcode 5中链接的错误,在iOS 6.x模拟器中,默认情况下它运行良好,thx :)
Zsivics Sanel 2014年

@BraveS:通过删除arm64体系结构,它将对64位设备有效吗?
Jayprakash Dubey 2015年

1
@JayprakashDubey您好,我上传了一个内置的应用商店,没有64位支持,他们拒绝了我的应用。当我尝试添加arm64时,我遇到一个错误构建失败“体系结构x86_64的未定义符号”。如果我从架构中删除arm64。我将arm64放入有效架构中。我的应用程序被批准了吗???
SP Balu Kommuri 2015年

31

架构x86_64的未定义符号:“ _ OBJC_CLASS _ $ _ xxx”,引用自:yyy.o中的objc-class-ref

这通常意味着您正在从类“ yyy”中调用“ xxx”(它可能是框架或类)。编译器无法找到“ xxx”,因此会发生此错误。

您需要通过在导航器窗口中右键单击项目文件夹并单击“ 将文件添加到“ YourProjectName “选项来添加丢失的文件(在这种情况下为“ xxx”)。

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


17

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

因此,如果其他解决方案(尤其是我怀疑是Chris和BraveS的解决方案)不太适合您的问题,请尝试删除派生数据(选择:窗口/项目/派生数据->删除)并重新构建。

(添加供其他人参考-我知道原始问题已正确回答)。


14

在Xcode 9.0b5下,您可能会遇到此问题,因为Xcode 9.0b5中存在一个错误,即在您添加源代码时,它不遵循目标设置。您必须进入并手动设置每个文件的目标后缀:

具有手动目标成员资格说明的Xcode项目


13

在我的案例中,它不是一个库,而是一些类..

架构x86_64的未定义符号:
“ _ OBJC_CLASS _ $ _ ClassNmae”,引用自:SomeClassName中的objc-class-ref。

d:找不到架构x86_64的符号

clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

解决方案 我在Xcode中有几个具有多个模式(生产,开发等)的目标。.我的一些新添加的实现(Class.m)在

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

所以我不得不手动添加它们。

这样我就可以成功编译和构建。


这解决了我的问题。我正在使用动态框架。另一件事是我不喜欢手动添加的想法。
toxicsun

9

我也遇到了同样的问题,以上方法均行不通。我不小心删除了以下目录中的文件。 在此处输入图片说明

要么

〜/库/开发人员/ Xcode / DerivedData /

在此处输入图片说明


4
对于那些想知道实际路径/命令是什么的人:~/Library/Developer/Xcode/DerivedData/ 通过CLI,您可以按以下方式清理目录:rm -rf ~/Library/Developer/Xcode/DerivedData/
Bramus

6

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

解决方法实际上非常简单。您只需要从“目标>构建设置>搜索路径”部分中的“框架搜索路径”设置中删除一个条目(确保已选择“所有”标签)

在此处输入图片说明

如果您在此处(主要(目标)或测试目标)看到另一个条目(除了$(继承)),只需从所有目标中删除错误的路径并重建即可。


5

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

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

这也假设您已完成上述建议,并已正确链接所有正确的框架。


5

我在这里尝试了几乎所有东西,但问题出在以前的cocoapods遗留物上。对我有用的是:

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

4

我有同样的错误,因为我没有删除文件,而是删除了对该文件的引用。在Finder中找到文件并将其删除会有所帮助。


3

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

但是通过设置选项来修复它:

Project -> Architecture -> Build Active Architecture Only

到是

和项目正确编译和构建


3

我已经多次面对这个问题。这通常在删除构建文件夹时出现。

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

pod deintegrate
pod install

2

如果尝试链接到C文件时遇到此错误,请首先仔细检查函数名称是否有错字。接下来,再次检查您是否在不使用C ++ / Objective-C ++环境的情况下不尝试调用C函数extern C {}。我正在撕头发,因为我在.mm文件中有一个试图调用C函数的类。这是行不通的,因为在C ++中,符号被弄乱了。您实际上可以看到使用nm工具生成的具体符号。终端到.o文件的路径,并nm -g在调用该符号的文件和应该包含该符号的文件上运行,然后您应该查看它们是否匹配,这可以为错误提供线索。

nm -g file.o

您可以检查与此杂乱的C ++符号:

nm -gC file.o

2

就我而言,我构建了一个自定义框架,将“部署目标”设置为9.1,但我的应用程序的“部署目标”较低,它支持8.1。最小化自定义框架部署目标解决了我的问题。


2

我参加聚会很晚,但是想再分享一个可能发生这种情况的场景。我正在研究一个框架,并通过可可豆分配它。该框架具有目标c和快速的类和协议,并且正在成功构建。在其他框架或项目中使用pod时,由于我忘记在podspec中包括.m文件,因此出现了此错误。请在您的podspec来源中包括.swtift,.h和.m文件,如下所示:s.source_files =“ Projectname / Projectname / ** / *。{swift,h,m}”

我希望它可以节省别人的时间。



1

对我来说,合并冲突后开始发生这种情况。

我尝试清理并删除构建文件夹,但没有任何帮助。无论如何,这个问题一直在发生。然后,我通过删除有问题的组并将其重新添加到项目中而重新工作,从而重新建立了参考。



1

就我而言,我必须添加

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

(Xcode 10.1)


1

这可能对某人有帮助。我花了几天的时间才终于弄清楚。我在OBJ-C工作,并且去了:

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

我正在使用遗留代码,通常是OBJ-C的新手,所以我什至没有想到将.m文件导入源库。

编辑:

再次遇到这个问题,这是另外一回事。经过5个小时的调试,此答案为我省了不少钱。尝试了该线程上的所有选项以及更多。https://stackoverflow.com/a/13625967/7842175如果这可以帮助您,请给他功劳,但基本上,您可能需要在文件检查器中将文件设置为其目标。

这是您的文件检查器,只需确保已选中所有需要的目标

总而言之,这是一个非常模糊的错误代码,可能由于多种原因而导致,因此请继续尝试其他选项。


1

有时,我忘了从通用发行版复制库,而错误地从发行iphoneos复制。通常,Release-iphoneos包含已为X86修剪的.a文件。因此它给出了错误。


1

就我而言,删除目标成员资格的选择,然后再次选择解决该问题。

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


0

就我而言,问题是编译后的框架体系结构。
我正在运行Xcode 11并使用Swift 5.1

  • 我有3个目标,例如:
    • MyApp
    • MyAppTests
    • MyAppFrameWork

我尝试运行测试,但MyAppFrameWork产品已针对通用iOS设备进行了编译,并且测试目标需要使用x86-64臂,因此我为iOS模拟器重建了框架,并且测试用例成功开始运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.