2015-10-16 88 views
0

我想在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') 

有警告: “功能 'multiply_vector' 在未找到库在调用LoadLibrary(线431)”。事实上,当我尝试检查“网管-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"做的是告诉编译器不要裂伤的名称。所以,而不是_Z15multiply_vectorPddiS_它将生成multiply_vector和MATLAB将能够找到它。