2015-10-16 123 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將能夠找到它。