основная функция уже определена в библиотеке ocaml asmrun

Я пытаюсь вызвать некоторый код 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

Это интересно, потому что я думал, что это незаконно, чтобы одно и то же имя функции определялось дважды в та же программа. Может быть, это одно из исключений в этом документе.

2

Решение

Ваша командная строка немного странная, как -lasmrun появляется дважды.

Вот то, что сработало для меня:

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

Вы можете увидеть рабочий пример в моем псевдоблоге: Далее OCaml GC Дисгармония.

(Поскольку я научился трудному пути, убедитесь, что вы следуете правилам гармонии ГК 🙂

2

Другие решения


По вопросам рекламы [email protected]