c++ - 在 Xcode 上的 Swift 项目上使用 C++ 时出错:架构 x86_64 的未定义符号
问题描述
网上有很多关于这个的问题,但我无法解决我的问题。这几天我一直在研究这个。
我想在 Swift 项目上运行一个简单的 C++ 类,为此我遵循了本教程:http ://www.swiftprogrammer.info/swift_call_cpp.html 。基本上我已经按照以下步骤操作:
- 创建
junk.cpp
和junk.h
文件 - 编译使用
g++ or/and clang++
- 创建 .a 文件:
$ ar r libjunkcpp.a junk.o
ranlib libjunkcpp.a
- 链接到 Xcode 中
Build Phases -> Link Binary With Libraries -> Add
当我编译时,出现以下错误:
Undefined symbols for architecture x86_64:
"A::getInt()", referenced from:
_getIntFromCPP in wrapper.o
"A::A(int)", referenced from:
_getIntFromCPP in wrapper.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
垃圾变种h
class A {
public:
A(int);
int getInt();
private:
int m_Int;
};
垃圾文件
#include "junk.h"
A::A(int _i) : m_Int(_i) {}
int A::getInt() {
return m_Int
}
包装器.cpp
#include "junk.h"
extern "C" int getIntFromCPP() {
// Create an instance of A, defined in
// the library, and call getInt() on it:
return A(1234).getInt();
}
桥接器
int getIntFromCPP();
解决方案
这是在使用通过 Objective-C 桥接到 Swift 的 C 或 C++ 库时有时会出现的问题。问题不在于归档(静态库)是如何构建的——而是过度激进的链接器创建应用程序的问题。
问题是链接器看到了绑定符号和 C++ 符号,但从来没有看到它被从任何地方调用,因为它实际上是从不同的语言 (Swift) 调用的。这最终导致链接器为了节省空间而积极地剥离所有它不认为正在使用的符号,从而有效地删除了所有 C++ 代码。
发生这种情况时,nm
将报告存档中存在正确的符号,但由于找不到符号,实际应用程序将无法执行。
至于解决方案,实际上 Stack Overflow 上已经有几个问题/答案在不同程度上解决了这个问题:
如何在 xcode 中禁用 C++ 死代码剥离,解决方案是使用链接器标志
-force_load
来强制实际加载静态符号。防止 Xcode 从静态库中删除未使用的符号,这建议使用
__attribute__((constructor))
来欺骗链接器认为符号在构造时是必需的,从而将它们保留在里面。Xcode Archive debug strip errors,更广泛地建议切换一些可能导致符号不被剥离的 Xcode 配置。但是,此处答案中的建议可能与上述两个链接相冲突。
wrapper.cpp
如果没有关于现有设置的更多信息,例如在哪里构建,以及如何在 Swift 项目中使用绑定,很难提供明确而明确的答案。鉴于这个问题是从 2018 年开始的,我不怀疑会有更多关于当时这个设置的信息。
从所描述的症状来看,这听起来与我的同事在进行 C++/Swift 绑定时所面临的问题完全一样——并且最终要使用的解决方案是-force_load
确保将存档完整地保存到最终应用程序中。
推荐阅读
- git - 拒绝或阻止本地 git 存储库上的历史记录重写
- c++ - sscanf_s:格式字符串“%d”需要一个“int *”类型的参数,但可变参数 4 的类型为“WORD *”
- ibm-cloud - IBM Watson Assistant:如何通过对话进行 API 调用
- mysql - MySQL 从数据库中删除 where
- arrays - 循环遍历正则表达式中的数组内的对象
- java - 使用 launch4J 构建 java exe 文件时出现错误:“AWT-EventQueue-0” java.lang.NoClassDefFoundError: javax/persistence/NoResultException
- angular - Ionic 4 / Angular 7 中的枚举和 ngModel 数据绑定
- python - 如何在 Python 中使用多实例定义属性?
- angular - 无法解析 APICalls 的所有参数:(?)
- r - 将 lapply 调用的输出写入单个表