安装后更改 OCaml 的 gcc
Changing OCaml's gcc after installation
我通过 OPAM 安装了 OCaml,默认情况下它使用 gcc
作为编译 .c
文件的命令。例如,如果我 运行 ocamlopt -verbose file.c
,我得到:
+ 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
中,更改它对已经编译的二进制文件没有任何作用。
ocamlopt
将 gcc
用于三件事。首先,用于编译 .c
出现在 ocamlopt
命令行上的文件。其次,用于组装它在编译 OCaml 源文件时内部生成的 .s
文件。第三,最后将目标文件链接在一起。
对于第一个和第三个,您可以提供带有 -cc
标志的不同编译器。
对于第二个,您需要重建 OCaml 编译器。
更新
这是我在 OS X 上使用 -verbose
标志编译 C 和 OCaml 模块时看到的内容:
$ 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
文件的处理方式,您需要重建编译器。我要更新上面的答案。
我通过 OPAM 安装了 OCaml,默认情况下它使用 gcc
作为编译 .c
文件的命令。例如,如果我 运行 ocamlopt -verbose file.c
,我得到:
+ 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
中,更改它对已经编译的二进制文件没有任何作用。
ocamlopt
将 gcc
用于三件事。首先,用于编译 .c
出现在 ocamlopt
命令行上的文件。其次,用于组装它在编译 OCaml 源文件时内部生成的 .s
文件。第三,最后将目标文件链接在一起。
对于第一个和第三个,您可以提供带有 -cc
标志的不同编译器。
对于第二个,您需要重建 OCaml 编译器。
更新
这是我在 OS X 上使用 -verbose
标志编译 C 和 OCaml 模块时看到的内容:
$ 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
文件的处理方式,您需要重建编译器。我要更新上面的答案。