Gần đây tôi đã quyết định tổ chức các tệp trong thư mục dự án của mình. Tôi đã chuyển các trình phân tích cú pháp mà tôi đã có cho một vài loại tệp khác nhau vào thư mục riêng của chúng và cũng quyết định sử dụng ocamlbuild (vì dự án trở nên phức tạp hơn và kịch bản lệnh shell đơn giản không còn đủ nữa). Tôi đã có thể bao gồm thành công các dự án bên ngoài bằng cách sửa đổi myocamlbuild với một số quy tắc cơ bản (gọi ocaml_lib
, tôi sẽ sử dụng ocamlfind một số thời gian khác), nhưng tôi bị mắc kẹt về cách đưa thư mục làm mô-đun vào dự án đúng cách . Tôi tạo ra một tập tin parser.mlpack
và điền nó với các mô-đun thích hợp để được bao gồm (ví dụ, "phân tích cú pháp/Ngày", et cetera), đã viết một parser.mli
trong thư mục gốc của thư mục để thực hiện của họ, và sửa đổi các tập tin _tags
(xem bên dưới) .Việc biên dịch đúng mô-đun trong các thư mục con (ocamlbuild)
Trong quá trình biên dịch, thư mục trình phân tích cú pháp được duyệt ngang một cách chính xác và parser.cmi
, parser.mli.depends
đều được tạo trong thư mục _build
; cũng như tất cả các tệp *.cm[xio]
trong thư mục con của trình phân tích cú pháp.
Tôi cảm thấy mình có thể đang làm điều gì đó dư thừa, nhưng bất kể dự án vẫn là không thể tìm thấy mô-đun Parser khi biên dịch!
Cảm ơn!
_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
lỗi biên dịch
/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.
Bạn sẽ nhận thấy -I parser
không được bao gồm trong các giai đoạn liên kết ở trên; thực sự không có tệp liên quan đến trình phân tích cú pháp nào được bao gồm!
chỉnh sửa: Đã thêm chi tiết mới từ nhận xét và câu trả lời bên dưới.
Có, tính năng này hoạt động nhưng không có hậu quả dự định. Một mô-đun đại diện cho nội dung của thư mục không được tạo; chúng được tham chiếu trực tiếp bởi các mô-đun con. Đối số '-pack' được thêm vào các mô-đun thích hợp trong quá trình biên dịch. Nhưng không được sử dụng trong sản phẩm cuối cùng. Giải thích của tôi về -pack có đúng không? – nlucaroni
'-pack' sẽ tạo mô-đun chứa các mô-đun khác làm mô-đun con. Mã khác của bạn sau đó phải gọi chúng là các mô-đun con của chúng (ví dụ: 'Parser.ConfParser'); nếu nó liên quan đến chúng trực tiếp (chỉ là 'ConfParser' mà không có' mở'ing 'Parser' đầu tiên), thì mọi thứ sẽ bị rối tung lên. Bạn có thể đăng đầu ra '-verbose' khi bạn không có' parser.mli' không? –
Tôi đã thêm lại tệp parser.mli. Tôi nghĩ rằng vì lý do nào đó một lỗi trong khi biên soạn các gói không phá vỡ nơi nó nên. ** Có một mô-đun bổ sung trong tệp 'mlpack' của tôi mà tôi đã di chuyển **. – nlucaroni