Установлен 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,

  1. проверьте, что у вас есть поддерживает установлен компилятор C, и он работает (очевидно).

    обратите внимание, что компилятор не обязательно должен быть в PATH, по крайней мере, в Windows/Visual Studio it нет.

  2. убедитесь, что Mathematica распознает компилятор

    << CCompilerDriver`
    CCompilers[]
    

    перечислит компиляторы, известные Mathematica.

  3. проверьте, какие команды Mathematica выполняет для компиляции сгенерированного кода C:

    Compiler`$CCompilerOptions = {"ShellCommandFunction" -> Print};
    Compile[{{x}}, x^2, CompilationTarget -> "C"];
    

    обратите внимание, что с "ShellCommandFunction" -> Print команды не будут выполняться, поэтому вам нужно будет переустановить Compiler`$CCompilerOptions to {} после завершения этого шага, чтобы разрешить выполнение команды снова.

  4. Проверьте выходные данные / ошибки компилятора:

    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"]