【问题标题】: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 调用它? 谢谢!

【问题讨论】:

    标签: c++ linux matlab shared-libraries


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      • 2012-11-01
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      • 2014-07-09
      • 1970-01-01
      相关资源
      最近更新 更多