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

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 将能够找到它。

【讨论】:

以上是关于如何在共享库中获取正确的函数名?的主要内容,如果未能解决你的问题,请参考以下文章

使用LD_PRELOAD拦截共享函数库的函数调用

定义相同函数名的两个 linux 共享对象之间的冲突

c++中如何获取函数名,和获取到一个基类指针后,如何判断它里面保存的是那个子类类型对象?

在严格模式下获取当前函数名

如何获取一个变量来表示“symbol-function()”的函数名

Python如何获取到当前函数名和通过字符串调用函数