如何在共享库中获取正确的函数名?
Posted
技术标签:
【中文标题】如何在共享库中获取正确的函数名?【英文标题】:How to get correct function name in shared library? 【发布时间】:2015-10-16 18:08:36 【问题描述】:我想在 Linux 中创建将由 MATLAB 加载和使用的共享库。 这是一个简单的例子:
#include "my_code.h"
void multiply_vector(double *x, double b, int N, double* y)
for (int i=0;i<N;i++)
y[i]=b*x[i];
在头文件中,我只是简单地声明了函数。然后使用 CMake 创建共享库。
add_library(my_library SHARED my_code.cpp)
install(TARGETS my_library LIBRARY DESTINATION .)
但是,当我在 MATLAB 中加载这个库时,使用:
loadlibrary('libmy_library.so','my_code.h')
带有警告:“在 loadlibrary 的库中找不到函数‘multiply_vector’(第 431 行)”。事实上,当我尝试使用“nm -D”命令检查共享库的内容时,我发现函数名称已更改并看到这一行:
0000000000000810 T _Z15multiply_vectorPddiS_
为什么会这样?如何获得库函数的好名称,以便 MATLAB 调用它? 谢谢!
【问题讨论】:
【参考方案1】:默认情况下,名称在 C++ 中被破坏。为了避免它,您需要将您的函数声明为extern "C"
。只需在函数定义前添加以下行:
extern "C" void multiply_vector(double *x, double b, int N, double* y);
extern "C"
所做的是告诉编译器不要破坏名称。因此,它将生成 multiply_vector
而不是 _Z15multiply_vectorPddiS_
,而 MATLAB 将能够找到它。
【讨论】:
以上是关于如何在共享库中获取正确的函数名?的主要内容,如果未能解决你的问题,请参考以下文章
c++中如何获取函数名,和获取到一个基类指针后,如何判断它里面保存的是那个子类类型对象?