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

时间:2013-08-23 17:27:33

标签: objective-c xcode macos cocoa iobluetooth

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;
}

感谢您提供任何帮助或指向正确的方向。

29 个答案:

答案 0 :(得分:109)

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

- 点击左侧窗格左上角的项目(蓝色图标)。

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

- 在“Link Binary With Libraries”下,单击加号按钮。

- 从列表中找到IOBluetooth.framework并点击Add。

enter image description here

enter image description here

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

enter image description here

答案 1 :(得分:48)

<强> UPD

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

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


旧答案

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

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

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

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

enter image description here

答案 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)

在Xcode 9.0b5下你可能会遇到这个问题,因为Xcode 9.0b5中有一个错误,当你添加源代码时,它不符合目标设置。您必须在以下字词后手动设置每个文件的目标:

Xcode project with manual target membership illustration

答案 6 :(得分:8)

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

或者

〜/库/开发商/ Xcode中/ DerivedData /

enter image description here

答案 7 :(得分:5)

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

修复实际上非常简单。您只需要从“目标搜索路径”设置中删除条目,该设置可在您的目标&gt;中找到。构建设置&gt; “搜索路径”部分(确保选中“全部”选项卡)

enter image description here

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

答案 8 :(得分:4)

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

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

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

答案 9 :(得分:4)

我在这里尝试了一切,但我的问题原来是以前cocoapods构建的遗留物。对我有用的是:

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

答案 10 :(得分:3)

我有同样的错误,因为我只是删除了对它的引用,而不是删除文件。在Finder中找到文件并删除它有帮助。

答案 11 :(得分:2)

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

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

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

答案 12 :(得分:1)

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

答案 13 :(得分:1)

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

答案 14 :(得分:1)

最后,使用干净的构建在Xcode中编译了项目。 我必须先运行这个。

rm -rf ~/Library/Developer/Xcode/DerivedData/*

那建筑物还可以。 ref

答案 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如果这可以帮助您,请给他功劳,但基本上,您可能需要在文件检查器中将文件设置为其目标。

This is your file inspector, just make sure all the targets you need are "ticked"

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

答案 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'

Reference

答案 27 :(得分:0)

我在使用 CocoaPods 时遇到了这个问题,但有一些没有特定版本的依赖项,这就是为什么在 pod update 之后它下载了包含一些重大更改的最新版本

  • 升级依赖项和使用它们的代码
  • 设置特定版本的 pod
  • 删除 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