gpt4 book ai didi

linux - GNU GMP 和 Matlab mex 在 Linux 下不协作

转载 作者:太空宇宙 更新时间:2023-11-04 03:34:05 25 4
gpt4 key购买 nike

我正在安装有 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”。我还可以编写一个小型 native 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 位于同一目录中)。

但是,我现在想要创建一个可以使用 Matlab 的 mex 编译器进行编译的 C 程序(该程序稍后应与 Matlab 接口(interface))。以下是上面的改编版最小示例,将使用 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 库,一旦打开 -fPIcflags,两次我都从 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 编译,有什么想法吗?

非常感谢! - 马里奥

最佳答案

啊,就是这样 - 我必须编译 GMP 库来生成共享库:

/configure --enable-shared --disable-static

然后,我获得 GMP 库 libgmp.so(以及 libgmp.so.10、libgmp.so.10.2.0),然后可以使用它来使用 mex 编译 C 文件:

mex MatlabTest.c libgmp.so

感谢您的提示!

关于linux - GNU GMP 和 Matlab mex 在 Linux 下不协作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32235945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com