Я пытаюсь вызвать некоторый код ocaml из программы на Си. Я следил за некоторыми документами Вот. C программа называется hello.c
и пытается использовать функции Ocaml, определенные в callme.ml
,
Как и в ссылке, я делаю это в два этапа: сначала скомпилируем файл ml в объектный файл:
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)
Обновить: эта проблема больше связана с правильным использованием флагов компоновщика C, а не ocaml. Использование флагов в следующем порядке решает проблему:
gcc -Wall -I`ocamlopt -where` -L`ocamlopt -where` -o hello hello.c -lasmrun callme2.o -lm -ldl -lasmrun
Это интересно, потому что я думал, что это незаконно, чтобы одно и то же имя функции определялось дважды в та же программа. Может быть, это одно из исключений в этом документе.
Ваша командная строка немного странная, как -lasmrun
появляется дважды.
Вот то, что сработало для меня:
$ W=`ocamlopt -where`
$ gcc -I $W -L $W -o hello hello.c callme.o -lasmrun -lm -ldl
Вы можете увидеть рабочий пример в моем псевдоблоге: Далее OCaml GC Дисгармония.
(Поскольку я научился трудному пути, убедитесь, что вы следуете правилам гармонии ГК 🙂