2017-10-05 138 views
1

我是OCaml的新手,但我試圖找出來自Node的相當於__filename__dirname。也就是說,我需要建立一個路徑相對到包含相關代碼的文件。OCaml:如何獲取當前模塊的路徑* /我的項目目錄?


僅供參考,我通過Ghuloum說的IACC工作:http://ell.io/tt$ocameel

我建立我的第一個編譯器,我有一個完全簡單化的「運行」文件(在C - temporarily)毗鄰編譯器的源代碼。我需要能夠將路徑傳遞給此文件,作爲參數(或預編譯版本,我想)到gcc或我的鏈接器,以便在我調用鏈接器/彙編程序工具時將其鏈接到我的編譯器輸出。 (這可能是一個愚蠢的問題 - 我在這裏有一個未知的未知數,「編譯器如何獲得鏈接器的運行時間」,或者類似的東西。關於慣用解決方案的任何評論這是值得歡迎的,即使它不是一個直接回答上面的問題!)

回答

2

如果您是通過ocaml myfile.ml直接運行源文件,Sys.argv.(0)會給你的路徑源文件,你可以使用Filename.dirname來從那裏獲取目錄。

如果您首先將源文件編譯爲可執行文件,然後運行可執行文件,則Sys.argv.(0)會給出可執行文件的名稱。在這種情況下,不可能獲得源代碼的位置(特別是如果您認爲運行可執行文件的人可能甚至沒有在他們的系統上的源代碼)。

如果您設置了項目結構,以便您的源代碼位於src /中,bin /中已編譯的二進制文件以及lib /中已編譯的stdlib,則可以使用Filename.dirname Sys.argv.(0)^"../lib"作爲gcc的庫路徑。無論您在將所有內容安裝到/usr/還是/usr/local/之後,運行ocaml src/mycompiler.mlbin/mycompiler或僅運行mycompiler都可以運行。

+0

是的,這就是我開始擔心的,在我的問題的一半。我想我需要弄清楚編譯器編寫者是如何將附加資源運送給用戶的。我想我可能不得不將文本(或鏈接到的對象?)插入到二進制文件中? :x謝謝,這對於腳本情況來說是一個很好的答案! – ELLIOTTCABLE

+0

@ELLIOTTCABLE如果你的項目按我的最後一段所描述的那樣佈置,它應該只適用於'argv。(0)'。如果您有需要訪問的其他資源,則可以將它們放入共享/並執行相同的操作。請注意,如果您的stdlib是動態鏈接的,並且您沒有安裝到標準路徑,那麼在運行編譯後的二進制文件時,您還需要設置LD_LIBRARY_PATH以查找.so,但這是無關緊要的問題。 – sepp2k