Swift项目中的C ++ dylib - 在dylib中公开的函数的未定义符号

时间:2018-03-21 12:17:13

标签: swift xcode dylib

C ++ dylib公开如下

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

在我的Swift项目中,我将Import Paths目录设置为包含我的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),但是我收到以下错误:

  

架构x86_64的未定义符号:“_addNumber”,引用   从:         _main in main.o ld:找不到架构x86_64 clang的符号:错误:链接器命令失败,退出代码为1(使用-v查看   调用)

因此虽然它正确连接,却无法找到符号。 我已经用nm(0000000000000d00(__TEXT,__ text)外部addNumber)和Hopper验证了这个函数确实存在于dylib中。

1 个答案:

答案 0 :(得分:1)

在C ++库中,您的函数必须标有extern "C" for C linkage:

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

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

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