2015-10-28 57 views
0

我通过OPAM安装OCaml,默认情况下它使用gcc作为编译.c文件的命令。举例来说,如果我跑ocamlopt -verbose file.c,我得到:安装后更改OCaml的gcc

+ gcc -Wall -D_FILE_OFFSET_BITS=64 -D_REENTRANT -g 
    -fno-omit-frame-pointer -c -I'/home/user/.opam/4.02.1+fp/lib/ocaml' 'test.c' 

我想改变所使用的OCaml的GCC二进制文件,例如用gcc-5.1/opt/my-gcc/bin/gcc来取代它。

有没有可能这样做,而无需重新配置和重新编译OCaml?我想我可以将一个gcc别名添加到PATH中的一个目录中,但我更喜欢一个更清晰的解决方案(如果有的话)。

要检查是否gcc基于文本的配置文件(我可以很容易地改变)没有选择,我搜索我的/home/user/.opam/4.02.1+fp目录gcc出现,但我发现一个非二进制文件的唯一发生率在lib/ocaml/Makefile.config,并改变它对已编译的二进制文件没有做任何事情。

+0

你想做什么,更改编译器中使用的c二进制文件或更改用于包的c编译器?在前者中,你需要重新编译。 – PatJ

+0

我想更改'ocamlopt'二进制文件用于查找GCC的路径。我希望有可能有环境变量或配置文件来改变它,但从你说的显然没有。 – anol

回答

1

ocamlopt使用gcc三件事。首先,编译出现在命令行ocamlopt.c文件。其次,用于汇编编译OCaml源文件时在内部生成的.s文件。第三,最后将目标文件链接在一起。

对于第一个和第三个,您可以提供一个带有-cc标志的不同编译器。

第二,你需要重建OCaml编译器。

更新

这是我看到OS X编译C和OCaml的模块与-verbose标志时:

$ ocamlopt -verbose -cc gcc -o m m.ml c.c 2>&1 | grep -v warning 
+ clang -arch x86_64 -c -o 'm.o' \ 
    '/var/folders/w4/1tgxn_s936b148fdgb8l9xv80000gn/T/camlasm461f1b.s' \ 
+ gcc -c -I'/usr/local/lib/ocaml' 'c.c' 
+ clang -arch x86_64 -c -o \ 
    '/var/folders/w4/1tgxn_s936b148fdgb8l9xv80000gn/T/camlstartup695941.o' \ 
    '/var/folders/w4/1tgxn_s936b148fdgb8l9xv80000gn/T/camlstartupb6b001.s' 
+ gcc -o 'm' '-L/usr/local/lib/ocaml' \ 
    '/var/folders/w4/1tgxn_s936b148fdgb8l9xv80000gn/T/camlstartup695941.o' \ 
    '/usr/local/lib/ocaml/std_exit.o' 'm.o' \ 
    '/usr/local/lib/ocaml/stdlib.a' 'c.o' \ 
    '/usr/local/lib/ocaml/libasmrun.a' 

因此,由-cc选项指定的编译器用于编译.c文件和最终链接。要更改对.s文件的处理,您需要重建编译器。我将在上面更新我的答案。

+0

[本地编译手册页](http://caml.inria.fr/pub/docs/manual-ocaml/native.html)(其中我搜索了'gcc'而不是'cc'并且错过了相关的内容选项)实际上表示,选项-cc会“使用ccomp作为调用的C链接程序来构建最终的可执行文件,并将其作为用于编译.c源文件的C编译器”。这似乎表明,步骤3也是由'-cc'中定义的编译器完成的。事实上,如果我在64位主机上尝试“-cc”gcc -m32“',当试图将ocamlopt产生的64位文件与我给它的'gcc -m32'选项连接起来时,'ld'会失败。 – anol

+0

(谢谢,我更新了我现在认为正确的答案。) –