将具有外部依赖项的共享库集成到 MATLAB |即犰狳、LAPACK、BLAS

Posted

技术标签:

【中文标题】将具有外部依赖项的共享库集成到 MATLAB |即犰狳、LAPACK、BLAS【英文标题】:Integration of Shared Libraries with external dependacies into MATLAB | ie Armadillo, LAPACK, BLAS 【发布时间】:2016-05-23 21:18:11 【问题描述】:

MATLAB 新手,事实上,我只是出于仿真目的处理它。我遇到了将共享库导入 MATLAB 的问题。假设我有一组复杂的 c 源文件,需要外部依赖项,例如 Armadillo 或 LAPACK。我们所做的是使用 gcc 或 g++ 编译代码,将库链接到这些包的位置。

    # Directories and Includes for Lin-Alg Libs
ARMA_INCLUDE = -I../../../armadillo/armadillo-6.600.4/include/
LAPACK_LIB   = -L../../../lapack/lib/
BLAS_LIB     = -L../../../lapack/lib/

ALL_INCLUDES = $(ARMA_INCLUDE) $(LAPACK_LIB) $(BLAS_LIB)

# Target Class
TARGET = target

# Compiler choice | Operation Code
CXX=g++
OPT = -O2

CXXFLAGS = $(CXX) $(OPT)

$(TARGET).so: $(TARGET).o $(OBJ_FILE)
        g++ -shared -Wl,--export-dynamic $(TARGET).o -o $(TARGET).so $(ALL_INCLUDES) $(LIB_FLAGS)

$(TARGET).o: $(TARGET).cpp
    $(CXXFLAGS) $(ARMA_LIB) $(ALL_INCLUDES) $(LIB_FLAGS) -DARMA_DONT_USE_WRAPPER -c target.cpp

这很有效,我可以完全按照我的意图调用这些库。现在我进入 matlab 环境并输入以下内容。

loadlibrary(target.so, 'target.h')

我收到以下错误消息...

Error using loadlibrary
Failed to preprocess the input file.
 Output from preprocessor is target.h:1:21: fatal error:
 armadillo: No such file or directory
 #include <armadillo>
                     ^
compilation terminated.


Error in MOculusEKF (line 5)
loadlibrary('target.so', 'target.h')

我知道 MATLAB 存在问题,看不到犰狳库的位置,但我没有找到任何将它们链接在一起的信息。

以下是有道理的,但犰狳没有打包成 dll,它是一个简单的脚本。

addpath('C:\Users\Dustin\armadillo\armadillo-6.600.4\include');
loadlibrary('armadillo')

随后调用加载 target.so。

我也知道我可以使用 mex 来解决这个问题,但这需要大量的转换代码,如果我能避免这种情况,那就太好了。

mex -larmadillo -lgfortran target.so

正如我所说,上面的工作量很大。我正在寻找一种在 loadlibrary 中以某种方式指定 -larmadillo 的方法。

有什么建议吗?? 谢谢!

【问题讨论】:

【参考方案1】:

我认为问题在于 Matlab 需要 mxArray 类型作为输入/输出。例如,犰狳库使用 Mat、Col 等。您可能需要先将其编译为 mex 文件。作为使用 Armadillo 和 Lapack 构建的示例,您可以查看我的工作:http://sigpack.sourceforge.net/build.html

【讨论】:

以上是关于将具有外部依赖项的共享库集成到 MATLAB |即犰狳、LAPACK、BLAS的主要内容,如果未能解决你的问题,请参考以下文章

如何包含具有多个 dll/dylib 的外部(共享)库

通过 Grab 添加的外部库的可选依赖项不可用

无法安装具有 C 依赖项的 Python 库

具有依赖项的 Maven2 + JMeter + JUnit

如何将依赖于 Styled Components 的 React 组件库提供给另一个也具有 Styled Comopnents 依赖项的库?

如何创建具有基本依赖项的 deb 包?