2015-10-28 56 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

(謝謝,我更新了我現在認爲正確的答案。) –