GCC установлен. Mathematica по-прежнему не будет компилировать C
Я запускаю Mathematica 8 на MacOSX, пытаясь скомпилировать даже простейшую программу для C. Все, что связано с C, просто не работает в Mathematica. У меня установлен GCC 4.2; Я даже переустанавливал его несколько раз с помощью XCode. Вот то, что я делаю, и ошибки, которые я получаю:
Во-первых, я всегда оцениваю команду
Needs["CCompilerDriver`"]
Если я установил цель компиляции в C,
c = Compile[ {{x}}, x^2 + Sin[x^2], CompilationTarget -> "C"];
Я получаю сообщение об ошибке: Compile:: nogen: библиотека не может быть создана из скомпилированной функции.
Если я попытаюсь создать библиотеку,
demoFile = FileNameJoin[{$CCompilerDirectory,"SystemFiles","CSource","createDLL_demo.c"}];
lib = CreateLibrary[{demoFile},"testLibrary"]
Я получаю сообщение $Failed. Вольфрам говорит, что это потому, что у меня нет компилятора C. Мне трудно поверить, потому что, когда я запускаю
CCompilers[]
Это говорит мне, что у меня установлен GCC: {{ "Name" → "GCC", "Компилятор" → CCompilerDriver'GCCCompiler`GCCCompiler, "CompilerInstallation" → "/usr/bin", "CompilerName" → Automatic}}
Что еще, терминал говорит, что у меня тоже установлен GCC!! Любая помощь будет оценена по достоинству. Мне бы очень хотелось скомпилировать Mathematica в C.
Ответы
Ответ 1
В этом ответе я получу некоторые шаги отладки для подобных проблем, для дальнейшего использования. Не стесняйтесь редактировать/улучшать их.
Если компиляция кода C не работает из Mathematica 8,
-
Убедитесь, что у вас установлен поддерживаемый компилятор C и он работает (очевидно).
Обратите внимание, что компилятор не обязательно должен находиться в PATH
, по крайней мере, в Windows/Visual Studio это не так.
-
Убедитесь, что Mathematica распознает компилятор
<< CCompilerDriver`
CCompilers[]
перечислит компиляторы, известные Mathematica.
-
Проверьте, какие команды Mathematica выполняет, чтобы скомпилировать сгенерированный код C:
Compiler`$CCompilerOptions = {"ShellCommandFunction" -> Print};
Compile[{{x}}, x^2, CompilationTarget -> "C"];
Обратите внимание, что при "ShellCommandFunction" -> Print
команды не будут выполняться, поэтому после завершения этого шага вам потребуется повторно установить Compiler`$CCompilerOptions
на {}
, чтобы снова выполнить команду.
-
Проверьте выходные/ошибки компилятора:
Compiler`$CCompilerOptions = {"ShellOutputFunction" -> Print};
Compile[{{x}}, x^2, CompilationTarget -> "C"];
Эти два последних шага, надеюсь, дадут вам достаточно подсказок для продолжения. С помощью этой информации вы можете проверить, переданы ли правильные пути библиотеки/включения в компилятор (в случае gcc/icc, посмотрите на параметр -L
, который указывает пути к библиотеке и параметр -I
, который указывает пути включения). Затем проверьте наличие необходимых файлов include и library на этих путях.
Ответ 2
Если вы получаете Compile:: nogen, вы можете увидеть выход компилятора, установив ShellOutputFunction- > Print right в выражении Compile:
c = Compile[ {{x}}, x^2 + Sin[x^2],
CompilationTarget -> {"C", "ShellOutputFunction"->Print}];
В общем, так вы можете передать параметры базовому вызову CreateLibrary, изменив CompilationTarget → "C" на CompilationTarget → { "C", опции}. Установка Compiler` $CCompilerOptions также работает, но этот метод имеет то преимущество, что не устанавливает глобальную переменную.
Ответ 3
Жаль, что единственная ошибка, которую вы видите, - $Failed, это не очень полезно; Интересно, есть ли проблемы с правами на файлы или каталоги?
Я работаю на linux, а не Mac, поэтому не уверен, что моя настройка "достаточно близко" или нет. На моей машине ваша команда Compile
преуспевает и генерирует файл .Mathematica/ApplicationData/CCompilerDriver/BuildFolder/blackie-desktop-5077/compiledFunction1.so
в моем домашнем каталоге. Есть ли способ найти каталог .Mathematica
, связанный с вашим идентификатором пользователя, и посмотреть, существует ли он и можно ли его записать математикой?
Кроме того, вы можете проверить, есть ли "gcc" или нет доступа, проверяя время доступа к файлу /usr/bin/gcc
до и после вашего вызова на Compile
. Из оболочки операционной системы вы можете сделать ls -lu /usr/bin/gcc
или из Mathematica, возможно, Import["!ls -lu /usr/bin/gcc", "Text"]