- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在安装有 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/
我试图通过用 C++ 编写一些函数并使用 mex 接口(interface)来集成它们来加速我的 Matlab 程序。我在 C++ 的向量中得到了我的结果。我想将它传输到 MATLAB 中的数组。我知
我用 C++ 编写了带有服务器和客户端的 TCPIP 套接字连接,它在 VisualStudio 中工作得很好。现在我想通过 MEX 文件在 MATLAB/Simulink 中使用 C++ - 客户端
我有返回 C++ 主机端数组的 cuda/C++ 代码。我想在 MATLAB 中操作这些数组,所以我用 mex 格式重写了我的代码并用 mex 编译。 我通过将预分配的数组从 MATLAB 传递到 m
我正在尝试将一段代码从 Matlab 转换为 python。我正在运行 Ubuntu 16.04LTS,需要依靠 Octave 来运行引用代码(Matlab 安装时出现深奥错误)。无论如何,以前从未使
我使用 VS2010 C-编译器在 Windows8 上开发了一个 Matlab mex 文件。很长一段时间,一切都很顺利…… 但是现在,mex 文件会阻止代码中的所有更改。无论我更改哪一行代码,重建
我的 C 代码应该将 Matlab 稀疏格式转换为 TAUCS format 也是列的主要格式。 当然,我是在 Matlab 本身生成 Matlab 稀疏格式,然后将其传输到 mex 文件。 代码编译
这是我编写的用于在制表符分隔文件中读取的 mex 代码。 mex 文件已创建,但它导致我的 MATLAB 突然结束并给出以下错误。谁能帮助我哪里出错了?如果需要任何进一步的信息,请告诉我 异常终止:分
我有一个 Matlab mex 函数,它重复调用名为 calculate(). 的 C 函数我制作了两个版本的函数: 版本A:每次mex()来电 calculate() ,它只传递输入参数,以及cal
我正在尝试在 MATLAB 中构建一个 mex 函数。该函数依赖于 C++ 库。但是,无论我做什么,我都会在 MATLAB 中得到 Unresolved external 问题。我创建了三个简单的文件
我正在尝试从 C++ 源代码编译一些 MATLAB MEX 文件。我正在尝试编译的文件 can be found here ;我在 32 位系统 MATLAB 2012a 上使用 Windows XP
我使用 mxCreateSparse 在 MEX 中创建了一个稀疏矩阵. mxArray *W; W=mxCreateSparse(n*n,n*n,xsize,mxREAL); double *wpo
我正在尝试在 C 语言的 MEX 文件中实现一些基本的线性代数例程以进行练习,但我被点积困住了。这是我到目前为止所拥有的: #define char16_t UINT16_T //shenanigan
我是编写 MEX 函数的新手,我有内存问题。 MEXf 逍遥法外的套路如下: void mexFunction (int nlhs, mxArray *plhs[], int nrhs,const m
我这里有一个可以正确执行的 C mex 文件,但是在执行完成后 MATLAB 因段错误而崩溃。由于它在程序完成执行后崩溃,这让我认为 MATLAB 自动释放分配的内存导致了这个问题。但是,我释放了我自
我有一个简单的 mex 函数,它从库中调用另一个 C++ 函数。我用编译源代码 mex -cxx mymexfunction.cpp -I/some/include -L/some/lib -lmyl
我正在寻找一种算法来找到 mex但除了这个 wiki 链接,找不到任何有用的东西。 看完后我拉出这段代码: nList = [int(x) for x in input().split()] nLis
我希望仅在通过 Matlab 中的 mex 命令编译我的代码时包含某个头文件。如果它是直接用 Visual Studio 编译的,我不希望包含它。 是否有一个宏可以帮助解决这个问题? 我想做这样的事情
如何在用 C 编写的 MEX 文件中创建二维稀疏矩阵。创建矩阵后如何像在 C 中一样单独访问元素,比如 mat[i][j]? 我厌倦了使用 mxCreateNumericArray函数,但我无法访问元
我正在尝试编译 a matlab wrapper for libdc1394这是一个用于火线相机的库。我收到一个奇怪的错误,涉及头文件中的一些内联函数。我正在使用 gcc-4.6 开发 ubuntu
我需要尽快将大量数据写入磁盘。在 MATLAB 中,我可以使用 fwrite 来做到这一点: function writeBinaryFileMatlab(data) fid = fopen(
我是一名优秀的程序员,十分优秀!