Mathematica中的$ SystemID不正确

时间:2011-12-02 04:58:12

标签: c++ wolfram-mathematica shared-libraries 32bit-64bit mathlink

我正在尝试在mathematica中链接Mathlink库。我使用的是x86_64-suse-linux操作系统,但当我在Mathematica中检查$ SystemID时,它告诉我我使用的是“Linux”而不是“Linux-x86-64”。

这是一个问题,因为如果我尝试将库链接为

g++ cpp2mma.cpp -L/usr/local/Wolfram/Mathematica/8.0/SystemFiles/Links/MathLink/DeveloperKit/Linux/CompilerAdditions/ -lML32i3 -lpthread -lstdc++ -lm -lrt

(32位版本 - Linux /中唯一的库)

我收到以下错误:

/usr/lib64/gcc/x86_64-suse-linux/4.5/../../../../x86_64-suse-linux/bin/ld: skipping incompatible 
/usr/local/Wolfram/Mathematica/8.0/SystemFiles/Links/MathLink/DeveloperKit/Linux/CompilerAdditions//libML32i3.so when searching for -lML32i3
/usr/lib64/gcc/x86_64-suse-linux/4.5/../../../../x86_64-suse-linux/bin/ld: skipping incompatible
/usr/local/Wolfram/Mathematica/8.0/SystemFiles/Links/MathLink/DeveloperKit/Linux/CompilerAdditions//libML32i3.a when searching for -lML32i3
/usr/lib64/gcc/x86_64-suse-linux/4.5/../../../../x86_64-suse-linux/bin/ld: cannot find -lML32i3 
collect2: ld returned 1 exit status

但是,如果我尝试将其链接为

g++ cpp2mma.cpp -L/usr/local/Wolfram/Mathematica/8.0/SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAdditions/ -lML64i3 -lpthread -lstdc++ -lm -lrt

它编译得很好,但如果我尝试运行它,我会收到以下错误:

./a.out: error while loading shared libraries: libML64i3.so: cannot open shared object file: No such file or directory

这个文件显然存在,因为运行'locate libML64i3.so'会产生:

/usr/local/Wolfram/Mathematica/8.0/SystemFiles/Libraries/Linux-x86-64/libML64i3.so
/usr/local/Wolfram/Mathematica/8.0/SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAdditions/libML64i3.so

我认为问题在于Mathematica认为我没有运行32位系统吗?如果是这样,我该怎么办?

1 个答案:

答案 0 :(得分:2)

问题不在Mathematica中。内核永远不会运行 - 从您正在编译和启动ELF可执行文件的e系统的角度来看。 libML64i3会为你启动一个内核,但它不会在这里加载。

有几种方法可以让链接器在运行时找到libML64i3.so

  1. 导出包含libML64i3.soLD_LIBRARY_PATH的目录(通常不是一个好主意)
  2. 使用/etc/ld.so.conf.d/etc/ld.so.conf中的条目来表明/usr/local/Wolfram/Mathematica/8.0/SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAdditions应该是图书馆搜索路径的一部分 - 请查看ldconfig(8)
  3. 符号链接libML64i3.so已存在于库搜索路径中
  4. 链接到静态版本的libML,如this StackOverflow post
  5. 中所述

    要处理编译时链接器错误,您可以32位编译应用程序(将-m32传递给g++)。如果你这样做了,你会得到一个关于无法找到32位版本的libML的运行时消息,这需要与上面相同的解决方案。

    我不确定为什么$ SystemID返回一个值,表明你正在运行32位内核。这可能与你如何开始Mathematica有关。在CentOS 5-7-x86_64上,我有

    host 11% ls -l $(which math)
    lrwxrwxrwx 1 root root 51 Nov  8 16:27 /usr/local/bin/math -> \
        /usr/local/Wolfram/Mathematica/8.0/Executables/math
    host 12% math
    Mathematica 8.0 for Linux x86 (64-bit)
    Copyright 1988-2011 Wolfram Research, Inc.
    
    In[1]:= $SystemID
    
    Out[1]= Linux-x86-64