Swift 项目中的 C++ dylib - dylib 中公开的函数的未定义符号
C++ dylib in Swift project - undefined symbols for function exposed in dylib
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++?。
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++?。