GCC已安装,但Mathematica仍无法编译为C。

11
我在MacOSX上运行Mathematica 8,尝试将最简单的程序编译为C。在Mathematica中与C有关的任何内容都无法正常工作。我已经安装了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", "Compiler" -> CCompilerDriver'GCCCompiler`GCCCompiler, "CompilerInstallation" -> "/usr/bin", "CompilerName" -> Automatic}}

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


1
文档显示MMA已经与GCC 4.0进行了测试。然而,我不认为小版本差异是您问题的根源。您是否检查过演示文件是否存在? - Sjoerd C. de Vries
你使用的Mathematica版本和OS X版本是什么?我使用的是V8.0.1和OS X 10.6.8,可以正常工作。(我的GCC版本与acl的相同。)我假设你能够成功编译一个简单的“hello world”程序? - Brett Champion
我刚刚在终端中使用gcc编译并运行了一个“hello world”程序。它正常工作。我正在运行OSX 10.6.7和V8.0.0。 - John Matok
我现在正在运行OSX 10.6.7,但仍然没有运气。 - John Matok
请查看此链接http://reference.wolfram.com/mathematica/Compile/tutorial/CompilationTarget.html#130334773以及文档中的以下部分。这将提供有关在调用编译器时计算机上正在发生的情况的更多信息。您得到了什么输出? - Szabolcs
显示剩余7条评论
3个回答

13
在这个答案中,我将收集一些类似问题的调试步骤,以备将来参考。随意编辑/改进它们。
如果从Mathematica 8编译到C代码无法工作,
  1. 检查您是否安装了支持的 C编译器并且它可以工作(很显然)。
  2. 请注意,编译器不一定必须在PATH中,至少在Windows / Visual Studio上是不需要的。

  3. 检查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选项)。然后检查所需的包含文件和库文件是否存在于这些路径中。

    请耐心等待,这对我来说变得陌生了。我运行了ShellCommandFunction,它给了我两个-I和两个-L路径。我不知道它们应该是什么,所以我不知道它们是否正确。唯一引起我的注意的是,第一个路径-I"/Applications/Mathematica.app/SystemFiles/IncludeFiles/C"没有包含任何文件。我的直觉是这里应该有些东西。我之前提到过,但我会再写一遍。ShellOutputFunction告诉我没有WolframLibrary.h和WolframCompileLibrary.h头文件。此时,我应该重新安装Mathematica吗? - John Matok
    1
    我刚刚重新安装了Mathematica。现在我有了头文件。我猜我的原始安装不完整。感谢您的所有帮助。 - John Matok
    我猜“ I” 路径是编译器搜索包含文件(.h)的路径,“ L” 路径是链接器搜索你链接代码时使用的附加库的路径。 - Leonid Shifrin
    感谢 @Leonid,我在答案中更明确地表达了这一点。 - Szabolcs
    @Szabolcs,您能否看一下我的问题?它与此非常相似,但是在Windows 8上。我不确定如何使用第3和第4点的信息...任何帮助将不胜感激。 http://stackoverflow.com/questions/26518086/mathematica-wont-compile-to-c-windows-8 - An old man in the sea.

    3
    如果你得到了Compile::nogen,你可以通过在编译表达式中设置ShellOutputFunction->Print来查看编译器输出。
    c = Compile[ {{x}}, x^2 + Sin[x^2], 
       CompilationTarget -> {"C", "ShellOutputFunction"->Print}];
    

    一般而言,您可以通过将CompilationTarget -> "C"更改为CompilationTarget -> {"C", options}来将选项传递给底层的CreateLibrary调用。设置Compiler`$CCompilerOptions也可以,但这种技术的优点是不会设置全局变量。

    1

    很遗憾,你只看到了一个错误信息$Failed,这并没有什么帮助;我想知道是否存在一些文件或目录权限问题?

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

    此外,你可以通过检查/usr/bin/gcc的文件访问时间来查看是否正在访问“gcc”,在调用Compile之前和之后。从操作系统shell中,你可以执行ls -lu /usr/bin/gcc,或者从Mathematica中执行Import["!ls -lu /usr/bin/gcc", "Text"]


    我发现了一个目录/Users/Noon/Library/Mathematica/ApplicationData/CCompilerDriver/BuildFolder/goble-1586,并且它是可写的。CCompilerDirectory中似乎没有文件。应该有吗?我刚才提到Mathematica找不到WolframLibrary.h和WolframCompileLibrary.h头文件。这可能是问题所在吗?Mathematica正在访问GCC。_/usr/bin/gcc -> gcc-4.2_ - John Matok
    也许你的安装不完整或已损坏?在我的机器上,$CCompilerDirectory有几个“.m”文件和三个目录(“Documentation”,“Kernel”和“SystemFiles”)。 - Daniel Chisholm

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接