Mathematica中的$SystemID不正确

Incorrect $SystemID in Mathematica

本文关键字:不正确 SystemID 中的 Mathematica      更新时间:2023-10-16

我正在尝试在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。所以的收益率:

/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位系统,这是正确的吗?如果有,我该怎么办?

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

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

  1. 通过LD_LIBRARY_PATH导出包含libML64i3.so的目录(通常不是一个好主意)
  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的静态版本,在这个StackOverflow帖子中描述。

要处理编译时链接器错误,可以将应用程序编译为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