繁体   English   中英

在 Xcode 上的 Swift 项目上使用 C++ 时出错:体系结构 x86_64 的未定义符号

[英]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。 基本上我遵循了以下步骤:

  1. 创建junk.cppjunk.h文件
  2. 使用g++ or/and clang++
  3. 创建一个文件: $ ar r libjunkcpp.a junk.o
  4. ranlib libjunkcpp.a
  5. 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 上已经有几个问题/答案在不同程度上解决了这个问题:

如果没有有关现有设置的更多信息(例如构建wrapper.cpp的位置以及如何在 Swift 项目中使用绑定),则很难提供明确明确的答案。 鉴于这个问题是从 2018 年开始的,我不怀疑会有更多关于当时的设置的信息。

从所描述的症状来看,这听起来就像我的同事在进行 C++/Swift 绑定时遇到的问题——解决方案最终是使用-force_load以确保将存档完整保留到最终应用程序中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM