如何在共享库中获取正确的函数名称?
How to get correct function name in shared library?
我想在 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')
有警告:"The function 'multiply_vector' was not found in the library in loadlibrary (line 431) "。事实上,当我尝试使用 "nm -D" 命令检查共享库的内容时,我发现函数名称已更改并看到这一行:
0000000000000810 T _Z15multiply_vectorPddiS_
为什么会这样?我怎样才能得到库函数的好名字,以便它可以被 MATLAB 调用?
谢谢!
名称在 C++ 中默认被破坏。为了避免它,你需要将你的函数声明为extern "C"
。只需在函数定义之前添加以下行:
extern "C" void multiply_vector(double *x, double b, int N, double* y);
extern "C"
所做的是告诉编译器不要破坏名称。因此,它将生成 multiply_vector
而不是 _Z15multiply_vectorPddiS_
,并且 MATLAB 将能够找到它。
我想在 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')
有警告:"The function 'multiply_vector' was not found in the library in loadlibrary (line 431) "。事实上,当我尝试使用 "nm -D" 命令检查共享库的内容时,我发现函数名称已更改并看到这一行:
0000000000000810 T _Z15multiply_vectorPddiS_
为什么会这样?我怎样才能得到库函数的好名字,以便它可以被 MATLAB 调用? 谢谢!
名称在 C++ 中默认被破坏。为了避免它,你需要将你的函数声明为extern "C"
。只需在函数定义之前添加以下行:
extern "C" void multiply_vector(double *x, double b, int N, double* y);
extern "C"
所做的是告诉编译器不要破坏名称。因此,它将生成 multiply_vector
而不是 _Z15multiply_vectorPddiS_
,并且 MATLAB 将能够找到它。