Во-первых, вы не получите сообщение об ошибке для connect
, поскольку в стандартной библиотеке уже есть функция connect
. Я настоятельно рекомендую переименовать вашу функцию, потому что mysql_real_connect
, вероятно, использует стандарт connect
для внутреннего использования, и это приведет к бесконечной рекурсии, если вы переопределите его следующим образом.
Цитирование из Руководство OCaml :
Если вы используете компилятор собственного кода ocamlopt
, флаг -custom
не требуется, так как последний этап связывания ocamlopt
всегда создает автономный исполняемый файл. Чтобы создать смешанный исполняемый файл OCaml / C, выполните команду ocamlopt
с:
- имена нужных собственных объектных файлов OCaml (
.cmx
и .cmxa
файлы);
- имена объектных файлов и библиотек C (
.o
, .a
, .so
или .dll
файлов), которые реализуют необходимые примитивы.
А также :
Команда ocamlopt
имеет интерфейс командной строки, очень близкий к интерфейсу ocamlc
. Он принимает те же типы аргументов и обрабатывает их последовательно после обработки всех опций:
[...]
Аргументы, заканчивающиеся на .cmx
, считаются скомпилированным объектным кодом. Эти файлы связаны друг с другом, вместе с объектными файлами, полученными путем компиляции аргументов .ml
(если есть), и стандартной библиотекой OCaml для создания исполняемой программы с собственным кодом. [...]
Аргументы, заканчивающиеся на .c
, передаются компилятору C, который генерирует объектный файл .o
/ .obj
. Этот объектный файл связан с программой.
и позже:
-cclib -l<i>libname</i>
Передайте параметр -l<i>libname</i>
компоновщику. Это приводит к тому, что данная библиотека C связана с программой.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: На самом деле я не проверял следующие шаги. Это именно то, что я думаю, имеет смысл прочитать документацию.
Исходя из этого, я полагаю, что правильная команда компиляции будет выглядеть так:
ocamlopt sql_conn.c main.ml -cclib -lmysqlclient
или в Makefile:
a.out: sql_conn.c main.ml
ocamlopt sql_conn.c main.ml -cclib -lmysqlclient
(Если вы хотите добавить цель main
, которая также выполняет файл, я бы сделал что-то вроде
.PHONY: main
main: a.out
./a.out
)
Если вы хотите разделить шаги, это будет выглядеть так:
Компиляция sql_conn.c
в sql_conn.o
:
gcc -c sql_conn.c
Компиляция main.ml
в main.cmx
(среди прочего):
ocamlopt -c main.ml
Свяжите их вместе в исполняемый файл:
ocamlopt sql_conn.o main.cmx -cclib -lmysqlclient
Или в форме Makefile:
1114 * *
Проблемы с вашими командами:
g++ -c sql_conn.c -lmysqlclient
g++
выбирает компилятор C ++ и готовится к связыванию со стандартными библиотеками C ++. -lmysqlclient
добавляет библиотеку mysqlclient
в набор.
Но -c
говорит ему не выполнять шаг компоновки (поэтому стандартная библиотека C ++ и mysqlclient
игнорируются), а имя файла (оканчивающееся на .c
) заставляет его переключиться на компилятор C.
Все это эквивалентно
gcc -c sql_conn.c
Это создает sql_conn.o
(объектный файл, содержащий скомпилированный код C).
ocamlopt main.ml
Это говорит ocamlopt
скомпилировать main.ml
, связать его со стандартными библиотеками OCaml и создать исполняемый файл с именем a.out
. Нет ничего, что подсказывало бы искать в sql_conn.o
, поэтому этот файл просто игнорируется.
Именно здесь вы получаете ошибку компоновщика, поскольку print_query
не был найден (он был определен в sql_conn.o
) Как упоминалось выше, вы не получаете сообщение об ошибке connect
, поскольку символ этого имени (хотя и с несовместимой подписью, но компоновщик не знает об этом) уже существует в системной библиотеке.