我試圖從C程序調用一些ocaml代碼。我一直在關注一些文檔here。 c程序被稱爲hello.c
,它正在嘗試使用在callme.ml
中定義的Ocaml函數。已在ocaml asmrun庫中定義的主要功能
爲鏈接,我分兩個步驟進行:先編譯毫升文件到目標文件:
ocamlopt -output-obj -o callme2.o callme.ml
,然後嘗試將其與這個代碼鏈接到我的「主」二進制:
gcc -Wall -I`ocamlopt -where` -L`ocamlopt -where` -lasmrun -lm -ldl -o hello hello.c callme2.o -lasmrun
但我遇到以下問題:main
已經在libasmrun.a定義,所以它與main
在我自己的hello.c
衝突:
/tmp/ccANhYNH.o: In function `main':
hello.c:(.text+0x58): multiple definition of `main'
/home/orm/.opam/4.02.0/lib/ocaml/libasmrun.a(main.o):main.c:(.text+0x0): first defined here
我該如何解決這個問題? (如庫路徑提示,我使用的是OCaml的版本4.02)
更新:這個問題有更多的事情要做的Ç連接標誌的正確用法,而不是ocaml的。按以下順序使用標誌解決了這個問題:
gcc -Wall -I`ocamlopt -where` -L`ocamlopt -where` -o hello hello.c -lasmrun callme2.o -lm -ldl -lasmrun
這很有趣,因爲我認爲這是非法的在same program定義了兩次相同的函數名。也許這是該文件中的一個例外。
規則爲什麼你在你的庫中的'main'? 'main'只能用於入口點。 – meneldal
只要調用'caml_main',你的C代碼就可以擁有'main'。 –
@meneldal:在'hello.c'中有一個main,在靜態庫中有一個。這需要這樣,因爲它是一個調用ocaml代碼的c程序。 Ocaml不知道這個C程序。由於某種原因,圖書館有其自己的主體,圖書館是一個標準的ocaml圖書館。 – orm