如何在共享库中获取正确的函数名称?

时间:2015-10-16 18:08:36

标签: c++ linux matlab shared-libraries

我想在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(第431行)的库中找不到函数'multiply_vector'”。实际上,当我尝试使用“nm -D”命令检查共享库的内容时,我会更改该函数名称并看到以下行:

0000000000000810 T _Z15multiply_vectorPddiS_

为什么会这样?如何才能获得库函数的良好名称,以便MATLAB可以调用它? 谢谢!

1 个答案:

答案 0 :(得分:2)

默认情况下,C ++中的名称会被破坏。为了避免这种情况,您需要将函数声明为extern "C"。只需在函数定义之前添加以下行:

extern "C" void multiply_vector(double *x, double b, int N, double* y);

extern "C"的作用是告诉编译器不要破坏名称。因此,它将生成_Z15multiply_vectorPddiS_而不是multiply_vector,而MATLAB将能够找到它。