198

一个 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 的实现时存在问题,而头文件来自标准包含的框架,称为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;
}

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

4

29 回答 29

136

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

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

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

  • 在“将二进制文件与库链接”下,单击加号按钮。

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

在此处输入图像描述

在此处输入图像描述

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

在此处输入图像描述

于 2013-08-24T00:43:52.973 回答
50

UPD

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

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


旧答案

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

有时错误“build failure “Undefined symbols for architecture x86_64””可能是由这个引起的。因为,一些库(不是 Apple 的)最初是为 x32 编译的,不支持 x64。

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

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

在此处输入图像描述

于 2014-03-28T08:54:29.687 回答
32

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

这通常意味着,您正在从类“yyy”中调用“xxx”(它可能是一个框架或类)。编译器找不到“xxx”所以出现这个错误。

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

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

于 2015-12-17T08:25:42.487 回答
18

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

因此,如果其他解决方案(尤其是我怀疑更有可能的 Chris 和 BraveS)不适合您的问题,请尝试删除派生数据(选择:Window / Projects / Derived Data -> Delete)并重新构建。

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

于 2016-01-01T19:34:46.563 回答
15

在 Xcode 9.0b5 下,您可能会遇到这种情况,因为 Xcode 9.0b5 中存在一个错误,即当您添加源代码时,它不遵守目标设置。您必须进入并手动设置每个文件的目标:

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

于 2017-08-16T17:59:14.070 回答
13

就我而言,它不是图书馆,而是一些课程..

架构 x86_64 的未定义符号:
“_OBJC_CLASS_$_ClassNmae”,引用自:objc-class-ref in SomeClassName”......

d:未找到架构 x86_64 的符号

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

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

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

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

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

于 2016-06-09T12:19:41.307 回答
9

我也遇到了同样的问题,以上方法都不行。我不小心把下面目录下的文件删了就可以了。 在此处输入图像描述

或者

~/库/开发者/Xcode/DerivedData/

在此处输入图像描述

于 2016-03-04T01:45:21.540 回答
8

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

  1. rm -Rf Pods; pod install
  2. 删除派生数据(窗口/项目...选择您的目标。单击删除按钮)
  3. 重建
于 2016-09-02T15:19:11.637 回答
7

我多次遇到这个问题。这通常在您删除构建文件夹时出现。

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

pod deintegrate
pod install
于 2019-04-16T12:00:21.163 回答
6

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

修复实际上非常简单。您只需要从 TARGETS > Build Settings > Search Paths 部分中的“Framework Search Paths”设置中删除一个条目(确保选中“All”选项卡)

在此处输入图像描述

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

于 2015-11-04T16:08:07.597 回答
6

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

解决方案是不添加文件夹,而是添加文件。执行此操作,您应该会看到 pbxproj 文件更新,它应该会修复此错误。

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

于 2016-03-28T16:44:57.943 回答
5

我知道这是一个老问题,但是今天遇到了同样的错误,并且上述解决方案都不起作用。

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

Project -> Architecture -> Build Active Architecture Only

并且项目可以正确编译和构建

于 2018-06-03T19:03:27.783 回答
4

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

于 2016-01-02T08:09:07.877 回答
4

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

于 2018-02-24T09:30:39.417 回答
3

如果您在尝试链接到 C 文件时遇到此错误,请首先仔细检查函数名称是否有拼写错误。接下来仔细检查您是否尝试在不使用该extern C {}构造的情况下从 C++/Objective-C++ 环境调用 C 函数。我把头发扯掉了,因为我有一个 .mm 文件中的类,它试图调用 C 函数。它不起作用,因为在 C++ 中,符号被破坏了。您实际上可以看到使用 nm 工具生成的具体符号。终端到 .o 文件的路径,在nm -g调用符号的文件和应该有符号的文件上运行,你应该看看它们是否匹配,这可以为错误提供线索。

nm -g file.o

您可以检查使用以下内容分解的 C++ 符号:

nm -gC file.o
于 2016-09-08T23:38:40.620 回答
3

在我的情况下,问题是编译的框架架构。
我正在运行Xcode 11并使用Swift 5.1

  • 我有 3 个目标,例如:
    • 我的应用
    • MyAppTests
    • MyAppFrameWork

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

于 2020-06-10T19:45:26.277 回答
3

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

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

然后楼就ok了。参考

于 2020-10-07T12:25:22.387 回答
2

我参加聚会迟到了,但我想再分享一个可能发生这种情况的场景。我正在研究一个框架,并将其分发到 cocoapods 上。该框架同时具有目标 c 和 swift 类和协议,并且构建成功。在另一个框架或项目中使用 pod 时出现此错误,因为我忘记在 podspec 中包含 .m 文件。请在您的 podspec 源中包含 .swtift、.h 和 .m 文件,如下所示: s.source_files = "Projectname/Projectname/**/*.{swift,h,m}"

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

于 2018-10-01T09:51:21.987 回答
2

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

于 2019-05-06T10:21:31.267 回答
2

帮助我s.static_framework = true的是/podspec在引发错误的项目中添加。

于 2021-03-04T17:30:18.770 回答
1

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

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

于 2017-04-03T15:26:36.917 回答
1

也可能是#include <windows.h>您尝试编译的 .c 文件中的一个。

于 2017-04-11T08:21:48.717 回答
1

就我而言,我必须添加

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

(Xcode 10.1)

于 2019-01-09T20:57:15.310 回答
1

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

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

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

编辑:

第二次遇到这个问题,这是另一回事。经过 5 个小时的调试,这个答案救了我。尝试了此线程上的所有选项等等。https://stackoverflow.com/a/13625967/7842175如果这对您有帮助,请给他信用,但基本上您可能需要在文件检查器中将文件设置为其目标。

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

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

于 2019-02-18T17:06:04.163 回答
1

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

于 2019-03-13T14:45:06.923 回答
1

在我的情况下,删除目标成员资格的选择,然后再次选择解决问题。

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

于 2019-05-29T18:56:14.613 回答
1

架构 x86_64 的未定义符号

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

  • 升级依赖项和使用它们的代码
  • 设置特定版本的 pod
  • 删除Derived Data[关于]文件夹
于 2021-04-26T15:57:37.510 回答
0

就我而言,我收到此错误:架构 x86_64 的未定义符号:“_OBJC_CLASS _ $ _ RCTImageLoader”

我可以通过在我的 Podfile 文件中添加以下行来修复它:

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

参考

于 2021-03-16T04:00:26.043 回答
0

当您在当前项目中使用架构 arm6、arm7 但您尝试在项目中使用的任何 3rd 方框架都是基于 x86_64 构建时,就会发生这种情况。

例如,如果您在项目中使用 Cocoa Pods,那么您需要添加以下脚本以确保所有 3rd 方框架都确保 arm6、arm7。IE

带有要在末尾添加的脚本的示例 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
于 2021-06-16T06:47:59.513 回答