将共享库与外部相关性集成到MATLAB中|即犰狳,LAPACK,BLAS

时间:2016-05-23 21:18:11

标签: c matlab linker lapack armadillo

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')

然后调用load target.so。

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

mex -larmadillo -lgfortran target.so

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

任何建议? 谢谢!

1 个答案:

答案 0 :(得分:1)

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