C++ dylib in Swift project - undefined symbols for function exposed in dylib

血红的双手。 提交于 2019-12-31 03:55:15

问题


C++ dylib exposes as follows

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

in my Swift project, I set the Import Paths dir to the dir containing my module.map file:

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

I manually add myLib.h to my project:

#ifndef mylib_h
#define mylib_h

int addNumber(int number);

#endif 

My main.swift does the following:

import Foundation
import MyLib

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

When I compile the swift project, I can see that it links against my dylib (-lMyLib), but I get the following error:

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)

So although it's linking correctly, it can't find the symbols. I've verified both with nm (0000000000000d00 (__TEXT,__text) external addNumber) and Hopper that this function does exist in the dylib.


回答1:


In the C++ library, your function must be marked with extern "C" for C linkage:

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

so that the compiler does not mangle the exported name. Swift can only call C functions, not C++ functions.

See also What is the effect of extern "C" in C++?.



来源:https://stackoverflow.com/questions/49406178/c-dylib-in-swift-project-undefined-symbols-for-function-exposed-in-dylib

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!