我构建了一个名为InterfaceLayer.so的动态库。 我打电话的时候:
> nm InterfaceLayer
作为输出,我得到一些看起来像这样的符号:
00000e28 T _Z5startv
虽然我期待它是“开始”,就像我在代码中定义的函数的名称一样。
任何线索?
TKZ
答案 0 :(得分:11)
那是因为C ++名称错误
nm -C
解开他们。
为防止名称损坏,
my.h
extern "C"
{
void start();
void finish();
}
这会给他们“C”联动,意思是他们不能超载,不能通过引用传递,没有c ++:)
答案 1 :(得分:3)
听起来像C++ name mangling。
答案 2 :(得分:2)
正如其他答案所提到的,这很可能是因为C ++名称错误。如果你希望符号可以通过它的'unmangled'名称访问,并且它是用C ++实现的,那么你需要我们extern "C"
告诉C ++编译器它有一个C链接。
在具有函数原型的标题中,您需要类似以下内容:
#if defined(__cplusplus)
extern "C" {
#endif
// the prototype for start()...
#if defined(__cplusplus)
}
#endif
这将确保如果C ++编译器使用该函数,它将在声明上获得extern "C"
,如果它被C模块使用,它将不会被{ {1}}说明符。
如果在函数定义之前包含标头,则.cpp文件中的实现不需要那些东西。它将使用它从前一个声明中看到的链接规范。但是,我更喜欢用extern "C"
装饰函数定义只是为了确保一切都是同步的(注意在.cpp文件中你不需要extern "C"
预处理的东西 - 它总是编译为C ++。