Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc matlab mex文件的共享库位置:_Gcc_Matlab_Mex_Hdf5_Rpath - Fatal编程技术网

Gcc matlab mex文件的共享库位置:

Gcc matlab mex文件的共享库位置:,gcc,matlab,mex,hdf5,rpath,Gcc,Matlab,Mex,Hdf5,Rpath,我正在尝试编写一个使用libhdf5的matlab mex函数;我的Linux安装提供了libhdf5-1.8共享库和头文件。但是,我的Matlab版本r2007b提供了1.6版本中的libhdf5.so。(显然,Matlab.mat文件引导hdf5)。当我编译mex时,它在Matlab中运行。如果我将libhdf5的版本降级到1.6(不是一个长期选项),代码编译和运行良好 问题:我如何解决这个问题?我如何告诉mex编译过程链接到/usr/lib64/libhdf5.so.6而不是/opt/ma

我正在尝试编写一个使用libhdf5的matlab mex函数;我的Linux安装提供了libhdf5-1.8共享库和头文件。但是,我的Matlab版本r2007b提供了1.6版本中的libhdf5.so。(显然,Matlab
.mat
文件引导hdf5)。当我编译mex时,它在Matlab中运行。如果我将libhdf5的版本降级到1.6(不是一个长期选项),代码编译和运行良好

问题:我如何解决这个问题?我如何告诉mex编译过程链接到/usr/lib64/libhdf5.so.6而不是/opt/matlab/bin/glnxa64/libhdf5.so.0?当我在编译中尝试使用
-Wl,-rpath链接,/usr/lib64
执行此操作时,会出现如下错误:

/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: warning: libhdf5.so.0, needed by /opt/matlab/matlab75/bin/glnxa64/libmat.so, may conflict with libhdf5.so.6
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status

    mex: link of 'hdf5_read_strings.mexa64' failed.

make: *** [hdf5_read_strings.mexa64] Error 1
阿克。最后一种方法是下载hdf5-1.6.5头文件的本地副本并使用它,但这不是未来的证明(我将来会升级Matlab版本)。有什么想法吗

编辑:根据Ramashalanka的优秀建议,我

A) 调用
mex-v
获取3个
gcc
命令;最后是linker命令

B) 使用
-v
调用该链接器命令,以获取
collect
命令

C) 调用了
collect2-v-t
和其他标志

我的输出的相关部分:

/usr/bin/ld: mode elf_x86_64
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crti.o
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/crtbeginS.o
hdf5_read_strings.o
mexversion.o
-lmx (/opt/matlab/matlab75/bin/glnxa64/libmx.so)
-lmex (/opt/matlab/matlab75/bin/glnxa64/libmex.so)
-lhdf5 (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/libhdf5.so)
/lib64/libz.so
-lm (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/libm.so)
-lstdc++ (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/libstdc++.so)
-lgcc_s (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/libgcc_s.so)
/lib64/libpthread.so.0
/lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2
-lgcc_s (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/libgcc_s.so)
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/crtendS.o
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crtn.o
因此,实际上正在引用
/usr/lib64
中的
libhdf5.So
。然而,我相信这是被环境变量
LD_LIBRARY_PATH
覆盖的,我的Matlab版本在运行时自动设置了该变量,以便它可以找到自己的版本,例如
libmex.so
,等等


我认为,
crt_file.c
示例要么在b/c中起作用,它没有使用我正在使用的函数(
H5DOpen
,它在从1.6移动到1.8的过程中有一个签名更改(是的,我使用的是
-DH5_use_16_API
),要么在b/c中,它没有击中需要hdf5的Matlab内部部分。确认。

以下各项在我的系统上起作用:

  • 安装hdf5版本1.8.4(您已经这样做了:我安装了源代码并进行了编译,以确保它与我的系统兼容,我获得了gcc版本,并且获得了静态库-例如,为我的系统提供的二进制文件是特定于icc的

  • 创建一个目标文件。您已经有了自己的文件。我使用了来自的简单的
    h5\u crtfile.c
    (首先从这个简单文件开始查找警告是个好主意)。我用常用的参数将
    main
    更改为
    mexFunction
    ,包括
    mex.h

  • 明确指定要加载的静态1.8.4库(完整路径,必要时不包含-L),并且在
    LDFLAGS
    中不包含
    -lhdf5
    。包括一个
    -t
    选项,以便确保没有加载动态hdf5库。您还需要安装
    -lz
    ,并安装
    zlib
    。对于达尔文,我们还需要
    LDFLAGS
    中的
    -bundle

    mex CFLAGS='-I/usr/local/hdf5/include' LDFLAGS='-t /usr/local/hdf5/lib/libhdf5.a -lz -bundle' h5_crtfile.c -v
    
    对于linux,您需要一个等效的位置独立调用,例如,
    fPIC
    和可能的
    -shared
    ,但我没有一个具有matlab许可证的linux系统,因此我无法检查:

    mex CFLAGS='-fPIC -I/usr/local/hdf5/include' LDFLAGS='-t /usr/local/hdf5/lib/libhdf5.a -lz -shared' h5_crtfile.c -v
    
  • 运行
    h5\u crtfile
    mex文件。这在我的机器上运行没有问题。它只是执行H5Fcreate和H5Fclose操作,在当前目录中创建“file.h5”,当我调用
    file file.h5
    时,我得到
    file.h5:层次数据格式(版本5)数据

  • 请注意,如果我在步骤3中包含一个
    -lhdf5
    ,那么当我尝试运行可执行文件时,matlab会中止(因为它随后使用matlab的动态库,对我来说是1.6.5版),因此这肯定解决了我系统上的问题


    谢谢你的提问。我上面的解决方案肯定比我以前做的要容易得多。希望以上内容对您有用。

    我接受Ramashalanka的答案,因为它让我找到了确切的解决方案,我将在这里发布,仅供完整参考:

  • 从hdf5网站下载hdf5-1.6.5库,并将头文件安装在本地目录中
  • 告诉mex在此本地目录中查找“hdf5.h”,而不是在标准位置(例如
    /usr/include
  • 告诉mex编译我的代码和matlab提供的共享对象库,不要使用
    LDFLAGS
    中的
    -ldfh5
    标志
  • 我使用的命令基本上是:

    /opt/matlab/matlab_default/bin/mex -v CC#gcc CXX#g++ CFLAGS#"-Wall -O3 -fPIC -I./hdf5_1.6.5/src -I/usr/include -I/opt/matlab/matlab_default/extern/include" CXXFLAGS#"-Wall -O3 -fPIC -I./hdf5_1.6.5/src -I/usr/include -I/opt/matlab/matlab_default/extern/include " -O -lmwblas -largeArrayDims -L/usr/lib64 hdf5_read_strings.c /opt/matlab/matlab_default/bin/glnxa64/libhdf5.so.0
    
    mex将其转换为以下命令:

    gcc -c -I/opt/matlab/matlab75/extern/include -DMATLAB_MEX_FILE -Wall -O3 -fPIC -I./hdf5_1.6.5/src -I/usr/include -I/opt/matlab/matlab_default/extern/include -O -DNDEBUG hdf5_read_strings.c
    gcc -c -I/opt/matlab/matlab75/extern/include -DMATLAB_MEX_FILE -Wall -O3 -fPIC -I./hdf5_1.6.5/src -I/usr/include -I/opt/matlab/matlab_default/extern/include -O -DNDEBUG /opt/matlab/matlab75/extern/src/mexversion.c
    gcc -O -pthread -shared -Wl,--version-script,/opt/matlab/matlab75/extern/lib/glnxa64/mexFunction.map -Wl,--no-undefined -o hdf5_read_strings.mexa64  hdf5_read_strings.o mexversion.o  -lmwblas -L/usr/lib64 /opt/matlab/matlab_default/bin/glnxa64/libhdf5.so.0 -Wl,-rpath-link,/opt/matlab/matlab_default/bin/glnxa64 -L/opt/matlab/matlab_default/bin/glnxa64 -lmx -lmex -lmat -lm -lstdc++
    
    这个解决方案应该适用于我所有的目标机器,至少在我升级到MatlabR2009a之前,我相信它使用的是hdf5-1.8。感谢所有的帮助,很抱歉我对这个问题太过关注了——我想我过于专注于使用hdf5的打包版本,而不是一组本地头文件


    注意,如果Mathworks提供了一组带有Matlab发行版的头文件,那么这一切都是微不足道的…

    hmmm。当我尝试这样做时,编译失败了b/c
    libmat。因此
    依赖于
    libhdf5.so
    。有点奇怪。不幸的是,我不能在不引入Mathworks的hdf5的情况下包含
    mex.h
    ;遗憾的是,Mathworks分发的头文件不包含
    hdf5.h
    。好的,我已经重写了这篇文章,看看它是怎么写的。我在shell中使用mex发出的gcc命令进行编译。所以我尝试了你的解决方案,跳过了第2步和第3步;(
    -bundle
    是达尔文特有的,顺便说一句)使用
    h5\u crtfile.c
    ,我得到“警告!此应用程序包含的HDF5头文件与此应用程序链接到的HDF5库使用的版本不匹配。如果应用程序继续运行,可能会发生数据损坏或分段错误。”HDF5\u禁用\u版本\u检查'环境变量集,应用程序将继续。页眉是1.8.4,库是1.6.5英寸,但是创建了
    file.h5
    !但是