GNU GMP和Matlab mex在Linux下没有合作

时间:2015-08-26 20:17:01

标签: linux matlab gcc mex gmp

我正在使用安装了Matlab R2015a的64位Ubuntu 14.04.3机器。 海湾合作委员会是:

gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-12ubuntu1) 

Matlab的mex也配置为使用这个编译器。 现在,我想使用GNU GMP任意精度算术库。 我下载了当前版本6.0.0并安装了它:

./configure
make
make check
sudo make install

一切正常;结果我得到“gmp.h”和“libgmp.a”。 我还可以编写一个小的本地C程序来演示GNU GMP库的工作原理:

#include <stdio.h>
#include "gmp.h"
int main() {
    mpz_t integ; /* Initialize the GMP variable */
    mpz_init(integ); /* Initialize the GMP variable */
    mpz_set_si(integ, 10); /* Assign a value */
    int test = (int)mpz_get_si(integ); /* Read the value into an int */
    printf("test = %.1f\n",(double)test); /*Print it */
return 0;
}

此程序编译并与

一起使用
gcc Test.c libgmp.a

如预期的那样(libgmp.a和gmp.h在同一个目录中)。

但是,我现在想要创建一个C程序,我可以使用Matlab的mex编译器进行编译(该程序后来应该与Matlab接口)。以下是使用Matlab的mex编译的上述改编的最小示例:

#include <stdio.h>
#include "mex.h"
#include "gmp.h"
void mexFunction( int nlhs, mxArray *plhs[],
    int nrhs, const mxArray *prhs[])
{
    mpz_t integ; /* Initialize the GMP variable */
    mpz_init(integ); /* Initialize the GMP variable */
    mpz_set_si(integ, 10); /* Assign a value */
    int test = (int)mpz_get_si(integ); /* Read the value into an int */
    mexPrintf("test = %.1f\n",(double)test); /*Print it */
}

同样,libgmp.a和gmp.h位于工作目录中。我现在尝试使用Matlab的mex编译这个程序:

mex MatlabTest.c libgmp.a

然而,我收到此错误:

Error using mex
/usr/bin/ld: libgmp.a(realloc.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
libgmp.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status

请记住,两个编译器都是相同的。我用-fpic标志重新编译了GMP库,一旦-fPIC标志打开,两次我从Matlab得到了相同的错误。

Matlab的构建输出(mex中的-v选项)是:

CXX="g++"
CFLAGS="-ansi -fexceptions -fPIC -fno-omit-frame-pointer -pthread -DMX_COMPAT_32   -D_GNU_SOURCE -DMATLAB_MEX_FILE "
CXXFLAGS="-ansi -fexceptions -fPIC -fno-omit-frame-pointer -pthread -DMX_COMPAT_32   -D_GNU_SOURCE -DMATLAB_MEX_FILE "
COPTIMFLAGS="-O -DNDEBUG"
CXXOPTIMFLAGS="-O -DNDEBUG"
CDEBUGFLAGS="-g"
CXXDEBUGFLAGS="-g"
LD="/usr/bin/gcc"
LDXX="g++"
LDFLAGS="-pthread -Wl,--no-undefined -Wl,-rpath-link,/usr/local/MATLAB/R2015a/bin/glnxa64 -shared  libgmp.a  -L"/usr/local/MATLAB/R2015a/bin/glnxa64" -lmx -lmex -lmat -lm -lstdc++ -Wl,--version-script,"/usr/local/MATLAB/R2015a/extern/lib/glnxa64/mexFunction.map""
LDDEBUGFLAGS="-g"
GCC : /usr/bin/gcc
CPPLIBS : /usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.so
MATLABROOT : /usr/local/MATLAB/R2015a
ARCH : glnxa64
SRC : /home/mario/GMPtest/Matlab-Test/MatlabTest.c
OBJ : /tmp/mex_52646937964974_11644/MatlabTest.o
OBJS : /tmp/mex_52646937964974_11644/MatlabTest.o 
SRCROOT : /home/mario/GMPtest/Matlab-Test/MatlabTest
DEF : /tmp/mex_52646937964974_11644/MatlabTest.def
EXP : MatlabTest.exp
LIB : MatlabTest.lib
EXE : MatlabTest.mexa64
ILK : MatlabTest.ilk
MANIFEST : MatlabTest.mexa64.manifest
TEMPNAME : MatlabTest
EXEDIR : 
EXENAME : MatlabTest
OPTIM : -O -DNDEBUG
LINKOPTIM : -O
-------------------------------------------------------------------
Building with 'gcc'.
/usr/bin/gcc -c -DMX_COMPAT_32   -D_GNU_SOURCE -DMATLAB_MEX_FILE  -I"/usr/local/MATLAB/R2015a/extern/include" -I"/usr/local/MATLAB/R2015a/simulink/include" -ansi -fexceptions -fPIC -fno-omit-frame-pointer -pthread -O -DNDEBUG /home/mario/GMPtest/Matlab-Test/MatlabTest.c -o /tmp/mex_52646937964974_11644/MatlabTest.o
/usr/bin/gcc -pthread -Wl,--no-undefined -Wl,-rpath-link,/usr/local/MATLAB/R2015a/bin/glnxa64 -shared  -O -Wl,--version-script,"/usr/local/MATLAB/R2015a/extern/lib/glnxa64/mexFunction.map" /tmp/mex_52646937964974_11644/MatlabTest.o   libgmp.a  -L"/usr/local/MATLAB/R2015a/bin/glnxa64" -lmx -lmex -lmat -lm -lstdc++ -o MatlabTest.mexa64

为什么它不能用matlab的mex编译的任何想法,虽然底层编译器是相同的?

最好也非常感谢! - 马里奥

0 个答案:

没有答案