Установлен 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 : A не удалось создать библиотеку из скомпилированной функции.
если я попытаюсь создать библиотеку,
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" -> Автоматические}}
более того, терминал говорит, что у меня тоже установлен GCC!! Любая помощь будет оценена. Я бы очень хотел скомпилировать Mathematica в C.
3 ответов
в этом ответе я соберу некоторые шаги отладки для подобных проблем для дальнейшего использования. Не стесняйтесь редактировать/улучшать их.
если компиляция в код C не работает из Mathematica 8,
-
проверьте, что у вас есть поддерживает установлен компилятор C, и он работает (очевидно).
обратите внимание, что компилятор не обязательно должен быть в
PATH
, по крайней мере, в Windows/Visual Studio it нет. -
убедитесь, что Mathematica распознает компилятор
<< CCompilerDriver` CCompilers[]
перечислит компиляторы, известные Mathematica.
-
проверьте, какие команды Mathematica выполняет для компиляции сгенерированного кода C:
Compiler`$CCompilerOptions = {"ShellCommandFunction" -> Print}; Compile[{{x}}, x^2, CompilationTarget -> "C"];
обратите внимание, что с
"ShellCommandFunction" -> Print
команды не будут выполняться, поэтому вам нужно будет переустановитьCompiler`$CCompilerOptions
to{}
после завершения этого шага, чтобы разрешить выполнение команды снова. -
Проверьте выходные данные / ошибки компилятора:
Compiler`$CCompilerOptions = {"ShellOutputFunction" -> Print}; Compile[{{x}}, x^2, CompilationTarget -> "C"];
эти последние два шага, надеюсь, дадут вам достаточно подсказок, чтобы продолжить. С помощью этой информации вы можете проверить, передаются ли компилятору правильные пути библиотеки / include (в случае gcc / icc посмотрите на -L
опция, которая указывает пути к библиотеке и -I
опция, которая указывает включить пути). Затем проверьте, требуется ли файлы include и library присутствуют в этих путях.
Если вы получаете Compile:: nogen, вы можете увидеть вывод компилятора, установив ShellOutputFunction - >Print прямо в выражении компиляции:
c = Compile[ {{x}}, x^2 + Sin[x^2],
CompilationTarget -> {"C", "ShellOutputFunction"->Print}];
В общем, так вы можете передать параметры базовому вызову CreateLibrary, изменив CompilationTarget->"C" на CompilationTarget - >{"C", options}. Настройка компилятора$CCompilerOptions тоже работает, но этот метод имеет то преимущество, что не устанавливает глобальную переменную.
жаль, что единственная ошибка, которую вы видите, это $ Failed, это не очень полезно; интересно, возможно, есть некоторые проблемы с разрешениями файлов или каталогов?
Я работаю на linux, а не на Mac, поэтому я не уверен, что моя настройка "достаточно близка" или нет. На моей машине ваш Compile
команда выполняется успешно и генерирует файл .Mathematica/ApplicationData/CCompilerDriver/BuildFolder/blackie-desktop-5077/compiledFunction1.so
в моем домашнем каталоге. Есть ли способ найти .Mathematica
каталог, связанный с вашим идентификатором пользователя, и посмотреть, существует ли он и пишется ли mathematica?
кроме того, вы можете проверить, доступен ли "gcc" или нет, проверив время доступа к файлу /usr/bin/gcc
до и после вашего звонка к Compile
. Оболочки операционной системы вы можете сделать ls -lu /usr/bin/gcc
или от Mathematica возможно Import["!ls -lu /usr/bin/gcc", "Text"]