11

我在 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 : A library could not be created from the compiled function。

如果我尝试创建一个库,

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" ->自动的}}

更重要的是,终端说我也安装了 GCC!任何帮助,将不胜感激。我真的很想将 Mathematica 编译为 C。

4

3 回答 3

13

在这个答案中,我将收集一些针对类似问题的调试步骤,以供将来参考。随意编辑/改进它们。

如果无法从 Mathematica 8 编译成 C 代码,

  1. 检查您是否安装了受支持的C 编译器并且它可以工作(显而易见)。

    请注意,编译器不一定必须在 中PATH,至少在 Windows/Visual Studio 中不需要。

  2. 检查 Mathematica 是否识别编译器

    << CCompilerDriver`
    CCompilers[]
    

    将列出 Mathematica 已知的编译器。

  3. 检查 Mathematica 执行哪些命令来编译生成的 C 代码

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

    注意,with"ShellCommandFunction" -> Print命令不会被执行,所以你需要在这一步完成后重新设置Compiler`$CCompilerOptions{}允许再次执行命令。

  4. 检查编译器的输出/错误:

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

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

于 2011-07-01T14:46:26.093 回答
3

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

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

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

于 2011-10-14T19:04:30.593 回答
1

很遗憾,您看到的唯一错误是$Failed,这并不是很有帮助;我想知道是否可能存在一些文件或目录权限问题?

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

此外,您可以通过检查/usr/bin/gcc调用Compile. 您可以从操作系统外壳ls -lu /usr/bin/gcc或 Mathematica执行Import["!ls -lu /usr/bin/gcc", "Text"]

于 2011-07-01T13:02:52.217 回答