【问题标题】:Incorrect $SystemID in MathematicaMathematica 中的 $SystemID 不正确
【发布时间】:2011-12-02 04:58:12
【问题描述】:

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

【问题讨论】:

  • 您肯定使用的是 32 位版本的 Mathematica。你从SystemInformation["Kernel", "ReleaseID"] 得到什么价值?
  • 你能发布 cpp2mma.cpp 吗?

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


【解决方案1】:

问题不在于 Mathematica。内核永远不会运行——从 e 系统的角度来看,您正在编译和启动 ELF 可执行文件。 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 中所述。

要处理编译时链接器错误,您可以编译 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 2020-02-16
    • 2011-11-24
    • 1970-01-01
    相关资源
    最近更新 更多