3

我正在尝试在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 位系统这一事实是否正确?如果是这样,我该怎么办?

4

1 回答 1

2

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

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

  1. 导出包含libML64i3.sothrough的目录LD_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 的静态版本,如StackOverflow 帖子中所述。

要处理编译时链接器错误,您可以编译 32 位应用程序(通过传递-m32g++)。如果您这样做,您将收到一条运行时消息,抱怨无法找到 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
于 2011-12-08T20:14:08.837 回答