[英]Dealing with C code dependencies inside OCaml projects
我正在使用 ocamlbuild 構建我的 OCaml 項目,該項目使用外部 C 庫“cstub”。 I found a very solution online to include the C library in the compilation process using ocamlbuild in http://l-lang.blogspot.com/2012/08/incorporating-c-code-in-ocaml-project.html (adding the pdep ["link";] "linkdep" (fun param -> [param]);
到myocamlbuild.ml
的行)。
但是,我的 C 庫本身具有外部 ASM 依賴項,上面的解決方案無法捕獲它。 它無法與 ASM 函數鏈接,因為它沒有與 ASM 文件一起編譯。 因此,我的問題是:在編譯 C 程序時,有沒有辦法調整上面給出的建議以添加對 ASM 文件的支持? 例如,是否需要在pdep
命令中添加額外的參數來支持額外的編譯功能?
非常感謝您!
所有與構建相關的問題的默認序言。 如果您有該選項,請考慮使用沙丘。 OCamlBuild 即將退休,因此不要期望太多幫助或良好的現代文檔。 話雖如此,我知道這並不總是一種選擇,我自己在我的主要項目中使用ocamlbuild
。
因此,您添加到 ocamlbuild 插件的pdep
規則采用了一個參數,例如,
<*.native>: linkdep(toto_c.o)
此toto_c.o
(或括號之間的任何內容)作為param
傳遞,您需要將其轉換為路徑列表,因此如果您的 asm 文件編譯為foo.o
,您可以將其寫為
<*.native>: linkdep(toto_c.o,foo.o)
你的pdep
規則應該是
pdep ["link"] "linkdep" (String.split_at_char ',')
如果您希望 ocamlbuild 從文件foo.s
構建foo.o
,您還需要編寫一個用於組裝文件的規則,( ocamlbuild -documentation
將向您顯示ocamlbuild
已知的所有規則,我沒有找到任何規則*.s -> *.o
模式)。
完全未經測試,但規則應該是這樣的,
let asm_rule () =
let deps = ["%.s"] and prod = "%.o" in
let action env _ =
let src = env "%.s" and obj = env "%.o" in
let tags = tags_of_pathname src ++ "compile" in
Cmd (S [Sh "as"; T tags; P src; A "-o"; Px obj]) in
rule "asm: s -> o" ~deps ~prod action
然后在Before_rules
階段的dispatch
中添加它,例如,
let () = dispatch (function
| Before_rules ->
asm_rule ()
| After_rules ->
pdep ["link"] "linkdep" (String.split_on_char ',')
| _ -> ())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.