【问题标题】:Symbol(s) not found for architecture x86_64 when using C/C++ library in Xcode project在 Xcode 项目中使用 C/C++ 库时未找到体系结构 x86_64 的符号
【发布时间】:2018-04-13 10:36:16
【问题描述】:

我正在开发一个使用 C/C++ 库的 Xcode 项目,我已将源代码导入到我的项目中。

我已经创建了对应的桥接头,并且我正在使用我最近创建的测试方法来查看代码是否有效。构建项目时出现错误

Symbol(s) not found for architecture x86_64

Xcode中显示的错误的完整输出是这样的

我的部署目标是 iOS 11,因此任何设备都不应使用 32 位,但我收到与 32 位架构相关的错误。

MyApp-Bridging-Header.h

//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//

#import "main.h"

头文件

#ifndef main_h
#define main_h

#include <stdio.h>

int my_print();

#endif /* main.h */

【问题讨论】:

  • 什么是 C/C++ 库?没有语言 C/C++。您在哪里看到 32 位的提示?你创建了什么标题?库没有带来所需的标题吗?
  • 使用 C 和 C++ 代码的库
  • my_print 是否使用 C 编译器编译,并且 main.h 包含在使用 C++ 编译的代码中?
  • 我没有编译它,我已经将源代码(所有.h和.c文件)导入Xcode。而且我认为它是 Xcode 在我点击 build 时编译库的那个
  • 不要垃圾标签。 C 不是 C++ 不是客观的-C 不是……我希望你明白了。并且一个库只能用要么 C C++ Objective C.

标签: c++ xcode bridging-header


【解决方案1】:

由于编译器抱怨找不到“_my_print”的定义,您可以 1) 检查链接库是否包含 _my_print 的定义 2)如果您使用XCODE UI构建,请尝试检查路径中是否添加了所有源并且库是否完整

在我看来,链接问题和错误配置似乎很简单

【讨论】:

    【解决方案2】:

    在尝试了很多人声称它解决了与此类似的问题之后,我在不知不觉中想出了解决方案。

    我之前的 main.h 文件就是这个

    #ifndef main_h
    #define main_h
    
    #include <stdio.h>
    
    int my_print();
    
    #endif /* main.h */
    

    extern "C" 包围我的函数解决了这个问题,现在我可以使用 Swift 与我的 C 和 C++ 库进行交互。现在main.h 文件看起来像这样

    #ifndef main_h
    #define main_h
    
    #include <stdio.h>
    
    #ifdef __cplusplus
    extern "C" {
    #endif
        int my_print();
    #ifdef __cplusplus
    }
    #endif
    
    #endif /* main.h */
    

    我不能 100% 确定这是如何工作的,所以如果有人能合理解释为什么会这样,我很高兴听到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多