2015-06-24 25 views
2

我試圖從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定義了兩次相同的函數名。也許這是該文件中的一個例外。

+0

規則爲什麼你在你的庫中的'main'? 'main'只能用於入口點。 – meneldal

+0

只要調用'caml_main',你的C代碼就可以擁有'main'。 –

+0

@meneldal:在'hello.c'中有一個main,在靜態庫中有一個。這需要這樣,因爲它是一個調用ocaml代碼的c程序。 Ocaml不知道這個C程序。由於某種原因,圖書館有其自己的主體,圖書館是一個標準的ocaml圖書館。 – orm

回答

2

你的命令行有點奇怪,因爲-lasmrun顯示了兩次。

這裏的東西已經爲我工作:

$ W=`ocamlopt -where` 
$ gcc -I $W -L $W -o hello hello.c callme.o -lasmrun -lm -ldl 

你可以看到我的僞博客工作的例子:Further OCaml GC Disharmony

(正如我學到了艱辛的道路,一定要按照GC和諧:-)

+0

感謝您的鏈接。 – orm

+0

快速的問題。符號確實被定義了兩次,那麼爲什麼在給定一個標誌排序時它是合法的,但是在給定不同順序的情況下是非法的? – orm

+0

我不是專家。但我認爲它是這樣的。鏈接器將它在庫中找到的第一個符號用於滿足外部引用。如果它首先在asmrun中找到'main',則需要它。但是hello.o中的符號沒有庫語義,它總是包含在內。如果鏈接器在hello.o之前看到asmrun,則會出現問題。如果它首先看到hello.o,它不再有不滿意的引用,所以它不關心asmrun中的'main'。 –