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 
鏈接210

它編譯就好了,但如果我嘗試運行它,我得到以下錯誤:

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

該文件存在明顯的運行「定位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

你肯定使用Mathematica的32位版本。你從SystemInformation [「Kernel」,「ReleaseID」]得到什麼值? –

+0

你能發佈cpp2mma.cpp嗎? –

回答

2

問題不在Mathematica中。內核永遠不會運行 - 從編譯和啓動ELF可執行文件的e系統的角度來看。 libML64i3會爲你啓動一個內核,但是它不會在這裏加載。

有幾種方法來獲取連接器在運行時查找libML64i3.so

  1. 出口含libML64i3.so通過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的靜態版本,如this StackOverflow post中所述。

要處理編譯時鏈接器錯誤,您可以編譯您的應用程序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