[英]Error to use C++ on Swift project on Xcode: Undefined symbols for architecture x86_64
网上有很多关于这个的问题,但我无法解决我的问题。 我已经研究了几天了。
我想在 Swift 项目上运行一个简单的 C++ 类,对此我遵循了本教程: http ://www.swiftprogrammer.info/swift_call_cpp.html。 基本上我遵循了以下步骤:
junk.cpp
和junk.h
文件g++ or/and clang++
$ ar r libjunkcpp.a junk.o
ranlib libjunkcpp.a
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;
};
垃圾.cpp
#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();
}
桥.h
int getIntFromCPP();
当使用通过 Objective-C 桥接到 Swift 的 C 或 C++ 库时,有时会出现这个问题。 问题不在于 Archive(静态库)的构建方式——而是创建应用程序的过于激进的链接器的问题。
问题是链接器看到了绑定符号和 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
以确保将存档完整保留到最终应用程序中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.