2010-02-05 73 views
9

我最近決定組織我的項目目錄中的文件。我把我有幾種不同文件類型的解析器移動到他們自己的目錄中,並決定使用ocamlbuild(隨着項目變得越來越複雜,簡單的shell腳本不再足夠)。正確編譯子文件夾中的模塊(ocamlbuild)

我能夠成功地通過修改myocamlbuild包含一些基本規則(調用ocaml_lib,我將在其他時間使用ocamlfind)來成功包含外部項目,但我堅持如何將該文件夾作爲模塊包含到項目中。我創建了一個parser.mlpack文件,並在其中填充了要包含的正確模塊(例如「解析器/日期」等),在目錄的根目錄中爲其實現編寫了parser.mli,並修改了文件_tags(請參見下文) 。

在編譯過程中,解析器目錄被正確遍歷,且parser.cmi,parser.mli.depends都在_build目錄中創建;以及解析器子目錄中的所有*.cm[xio]文件。

我覺得我可能會做些多餘的事情,但無論如何,項目仍然找不到解析器模塊時,我編譯!

謝謝!

_tags

debug : true 
<*.ml> : annot 
"parser" : include 
<parser/*.cmx>: for-pack(Parser) 
<curlIO.*> : use_curl 
<mySQL.*> : use_mysql 
<**/*.native> or <**/*.byte> : use_str,use_unix,use_curl,use_mysql 

編譯錯誤

/usr/local/bin/ocamlopt.opt unix.cmxa str.cmxa -g -I /usr/local/lib/ocaml/site-lib/mysql mysql.cmxa -I /usr/local/lib/ocaml/curl curl.cmxa curlIO.cmx utilities.cmx date.cmx fraction.cmx logger.cmx mySQL.cmx data.cmx project.cmx -o project.native 
File "\_none\_", line 1, characters 0-1: 
Error: **No implementations provided for the following modules:** 
     Parser referenced from project.cmx 
Command exited with code 2. 

你會發現-I parser不包括在上面的鏈接階段;實際上沒有包含解析器相關的文件!

編輯:在下面的評論和回答中添加新的細節。

回答

3

我不知道是否parser.mli在某種程度上干擾了處理mlpack文件的依賴性。將在處理和編譯parser.mlpack時從包操作生成parser.cmi。嘗試刪除parser.mli文件的構建。如果這有效,那麼這可以重新處理成一個真正的答案。

而且,你不需要parser/作爲一個前綴爲您的模塊parser.mlpack如果parser.mlpack是在parser目錄,你有include標籤設置。但是,這不應該有所作爲。

更新:這個解決了問題,但不是根本原因。根源,下面的每條評論都是.mlpack中提到的文件,這些文件已被重新定位。

+0

是的,這工作,但沒有預期的後果。表示目錄內容的模塊未創建;它們直接由子模塊引用。 '-pack'參數在編譯期間會添加到適當的模塊中。但不用於最終產品。我的解釋是關於-pack不正確的嗎? – nlucaroni 2010-02-08 18:06:12

+0

'-pack'應創建一個包含其他模塊作爲子模塊的模塊。您的其他代碼必須將它們稱爲它們的子模塊(例如'Parser.ConfParser');如果它直接引用它們(只要'ConfParser'沒有首先打開'Parser'),那麼事情就會變得混亂。 你能張貼'-verbose'輸出,當你沒有'parser.mli'? – 2010-02-08 18:12:00

+1

我添加了parser.mli文件。我認爲出於某種原因編譯該包時出現錯誤並沒有打破它應該的位置。 **我的'mlpack'文件中有一個額外的模塊,我移動了**。 – nlucaroni 2010-02-08 20:46:57

4

您需要在搜索路徑中「包含」解析器目錄。您可以在_tags做到這一點:

"parser": include 

然後ocamlbuild可以搜索解析器目錄有趣的文件。

+1

當然應該是 - >「parser」:include – ygrek 2010-02-08 05:30:52

+0

@ygrek謝謝 - 已更新。 – 2010-02-08 14:55:38

+0

...我修改了上面的問題。這有幫助,但我實際上已經這樣做了,但是來自命令行與'-I parser'的等價。現在,我只是用'ocamlbuild項目來構建。 ' – nlucaroni 2010-02-08 15:43:38

相關問題