gpt4 book ai didi

swift - Swift 项目中的 C++ dylib - dylib 中公开的函数的 undefined symbol

转载 作者:行者123 更新时间:2023-11-28 06:01:53 26 4
gpt4 key购买 nike

C++ dylib 暴露如下

__attribute__((visibility("default"))) int addNumber(int number) {
return 0;
}

在我的 Swift 项目中,我将导入路径目录设置为包含我的 module.map 文件的目录:

module MyLib {
header "myLib.h"
export *
}

我手动将 myLib.h 添加到我的项目中:

#ifndef mylib_h
#define mylib_h

int addNumber(int number);

#endif

我的 main.swift 执行以下操作:

import Foundation
import MyLib

print("Hello, World!")
var result = addNumber(3)

当我编译 swift 项目时,我可以看到它链接到我的 dylib (-lMyLib),但我收到以下错误:

Undefined symbols for architecture x86_64: "_addNumber", referenced from: _main 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)

因此,尽管链接正确,但找不到符号。我已经用 nm (0000000000000d00 (__TEXT,__text) external addNumber) 和 Hopper 验证了这个函数确实存在于 dylib 中。

最佳答案

在C++库中,你的函数必须用extern "C"标记对于 C 链接:

extern "C" __attribute__((visibility("default"))) int addNumber(int number) {
return 0;
}

这样编译器就不会破坏导出的名称。 swift 只能调用 C 函数,而不是 C++ 函数。

另见 What is the effect of extern "C" in C++? .

关于swift - Swift 项目中的 C++ dylib - dylib 中公开的函数的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49406178/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com