Неверный $ SystemID в Mathematica - PullRequest
       19

Неверный $ SystemID в Mathematica

3 голосов
/ 02 декабря 2011

Я пытаюсь связать библиотеки Mathlink в Mathematica. Я использую ОС x86_64-suse-linux, но когда я проверяю $ SystemID в Mathematica, он говорит мне, что я использую «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-битную систему? Если да, что мне делать?

1 Ответ

2 голосов
/ 09 декабря 2011

Проблема не в Mathematica. Ядро никогда не работает - с точки зрения системы, которую вы компилируете и запускаете исполняемый файл ELF. 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, как описано в этом сообщении 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
...