Gcc 更改OCaml';安装后的通用条款
我通过OPAM安装了OCaml,默认情况下,它使用Gcc 更改OCaml';安装后的通用条款,gcc,ocaml,Gcc,Ocaml,我通过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或/op
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
别名添加到路径
中的一个目录中,但如果有更干净的解决方案,我更喜欢它
为了检查
gcc
是否不是基于文本配置文件选择的(我可以很容易地更改),我在/home/user/.opam/4.02.1+fp
目录中搜索了gcc
,但在非二进制文件中找到的唯一匹配项是lib/ocaml/Makefile.config
,更改它对已编译的二进制文件没有任何作用。ocamlopt
将gcc
用于三件事。首先,用于编译出现在ocamlopt
命令行上的.c
文件。第二,用于汇编编译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
文件的处理方式,需要重建编译器。我将更新上面的答案。您想做什么,更改编译器中使用的c二进制文件,还是更改包中使用的c编译器?在前者中,您需要重新编译。我想更改ocamlopt
二进制文件使用的路径以查找GCC。我希望可能会有环境变量或配置文件来更改它,但根据您所说的,显然没有。实际上(我在其中搜索了“gcc”而不是“cc”,并错过了相关选项),选项-cc确实如此“使用ccomp作为调用的C链接器来构建最终的可执行文件,并作为编译.C源文件的C编译器”。这似乎表明步骤3也由-cc
中定义的编译器完成。事实上,如果我尝试-cc“gcc-m32“
在64位主机上,ld
尝试将ocamlopt生成的64位文件与我提供的gcc-m32
选项链接时失败。(谢谢,我更新了我现在认为正确的答案。)