已安装GCC。Mathematica仍然获胜';t编译成C

已安装GCC。Mathematica仍然获胜';t编译成C,c,gcc,compiler-construction,wolfram-mathematica,mathematica-8,C,Gcc,Compiler Construction,Wolfram Mathematica,Mathematica 8,我在MacOSX上运行Mathematica 8,试图将最简单的程序编译成C。任何与C有关的东西在Mathematica中都不起作用。我安装了GCC 4.2;我甚至用XCode多次重新安装了它。以下是我正在做的事情和我遇到的错误: 首先,我总是评估命令 Needs["CCompilerDriver`"] 如果我将编译目标设置为C c = Compile[ {{x}}, x^2 + Sin[x^2], CompilationTarget -> "C"]; 我得到一个错误:Compile:

我在MacOSX上运行Mathematica 8,试图将最简单的程序编译成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。Wolfram说这是因为我没有安装C编译器。我觉得很难相信,因为当我跑步的时候

CCompilers[]
它告诉我已经安装了GCC:{{“Name”->“GCC”, “编译器”->CCompilerDriver'GCCCompiler`GCCCompiler, “编译器安装”->“/usr/bin”,“编译器名称”->Automatic}”


而且,终端说我也安装了GCC!!任何帮助都将不胜感激。我真的很想把Mathematica编译成C。

遗憾的是,您看到的唯一错误是$Failed,这没有多大帮助;我想知道是否有一些文件或目录权限问题

我在linux而不是Mac上运行,所以我不确定我的设置是否“足够接近”。在我的机器上,您的
Compile
命令成功,并在我的主目录中生成一个文件
.Mathematica/ApplicationData/CCompilerDriver/BuildFolder/blackie-desktop-5077/compiledFunction1.so
。是否有任何方法可以找到与您的用户ID关联的
.Mathematica
目录,并查看它是否存在,以及Mathematica是否可以写入


此外,您还可以通过在调用
Compile
之前和之后检查
/usr/bin/gcc
的文件访问时间来检查是否正在访问“gcc”。从操作系统外壳中,您可以执行
ls-lu/usr/bin/gcc
或从Mathematica导入[“!ls-lu/usr/bin/gcc”,“Text”]在这个回答中,我将收集一些针对类似问题的调试步骤,以供将来参考。请随意编辑/改进它们

如果从Mathematica 8编译到C代码不起作用

  • 检查您是否安装了C编译器,并且它可以正常工作(显而易见)

    请注意,编译器不一定必须位于
    路径中,至少在Windows/Visual Studio上不必如此

  • 检查Mathematica是否识别编译器

    << CCompilerDriver`
    CCompilers[]
    
    请注意,使用
    “ShellCommandFunction”->Print
    将不会执行命令,因此在完成此步骤后,需要将
    编译器`$CCompilerOptions
    重新设置为
    {}
    ,以允许再次执行命令


  • 这最后两个步骤有望为您提供足够的线索继续进行。使用此信息,您可以检查是否将正确的库/包含路径传递给编译器(对于gcc/icc,请查看指定库路径的
    -L
    选项和指定包含路径的
    -I
    选项)。然后检查这些路径中是否存在所需的include和library文件。

    如果获得Compile::nogen,则可以通过在编译表达式中设置ShellOutputFunction->Print来查看编译器输出:

    c = Compile[ {{x}}, x^2 + Sin[x^2], 
       CompilationTarget -> {"C", "ShellOutputFunction"->Print}];
    

    通常,通过将CompilationTarget->“C”更改为CompilationTarget->{“C”,options},可以将选项传递给基础CreateLibrary调用。设置编译器“$CCompilerOptions”也可以,但这种技术的优点是不设置全局变量。

    文档中说MMA已经用GCC4.0进行了测试。然而,我不希望一个微小的版本差异成为您问题的根源。是否检查了演示文件是否存在?是的,演示文件存在于以下位置:/Applications/Mathematica.app/AddOns/Applications/CCompilerDriver/\SystemFiles/CSource/createDLL\u demo。c@sjoerd它不是gcc版本,例如在我的,
    Import[“!gcc--version”,“Text”]
    i686-apple-darwin10-gcc-4.2.1(gcc)4.2.1(Apple Inc.build 5666)(dot 3)
    (随后是版权通知)Mathematica的哪个版本,OS X的哪个版本?它适用于我的V8.0.1和OS X 10.6.8。(我的GCC版本与acl相同)。我假设你可以成功编译一个简单的“hello world”程序?我刚刚编译并运行了一个“hello world”在终端中使用gcc的程序。它运行得很好。我正在运行OSX 10.6.7和V8.0.0。我发现一个目录
    /Users/Noon/Library/Mathematica/ApplicationData/CCompilerDriver/BuildFolder/goble-1586
    ,每个人都可以写。CCompilerDirectory中似乎没有文件。应该有吗?我刚才提到的Mathematica c找不到WolframLibrary.h和WolframCompileLibrary.h头文件。这可能是问题所在吗?Mathematica正在访问GCC./usr/bin/GCC->GCC-4.2如果您的安装不完整或损坏?在我的机器上,$CCompilerDirectory有几个“.m”文件和三个目录(“文档”、“内核”和“系统文件”)请耐心听我说,这对我来说越来越陌生了。我运行了
    ShellCommandFunction
    ,它给了我两条
    -I
    和两条
    -L
    路径。我不知道它们应该是什么,所以我不知道它们是否错了。我唯一突出的是第一条路径,
    -I“/Applications/Mathematica.app/SystemFiles/IncludeFiles/C"
    没有包含任何文件。我的直觉是这里应该有一些东西。我之前提到过,但我会再写一遍。
    ShellOutputFunction
    告诉我没有WolframLibrary.h和WolframCompileLibrary.h头文件。现在,我应该重新安装Mathematica吗?我刚刚重新安装了Mathematica。现在我有了头文件是的。我想我的原始安装没有完成。感谢您的帮助。我想“I”路径是编译器搜索包含文件的路径(
    .h
    Compiler`$CCompilerOptions = {"ShellOutputFunction" -> Print};
    Compile[{{x}}, x^2, CompilationTarget -> "C"];
    
    c = Compile[ {{x}}, x^2 + Sin[x^2], 
       CompilationTarget -> {"C", "ShellOutputFunction"->Print}];