3

mathematica で Mathlink ライブラリをリンクしようとしています。x86_64-suse-linux OS を使用していますが、Mathematica で $SystemID を確認すると、「Linux-x86-64」ではなく「Linux」を使用していると表示されます。

ライブラリを次のようにリンクしようとすると、これは問題です

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 にはありません。カーネルは実行されていません。システムの観点からは、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/CompilerAdditionsldconfig(8)
  3. libML64i3.soライブラリ検索パスのどこかにすでにあるシンボリックリンク
  4. この StackOverflow の投稿で説明されているように、libML の静的バージョンにリンクします。

コンパイル時のリンカ エラーに対処するために、アプリケーションを 32 ビットでコンパイルできます (に渡す-m32ことによりg++)。これを行うと、libML の 32 ビット バージョンが見つからないことを示す実行時メッセージが表示され、上記と同じ解決策が必要になります。

$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 に答える