C код с помощью gcc не может ссылаться на заголовок MySQL - PullRequest
0 голосов
/ 12 ноября 2018

Я бы хотел опираться на этот пост, потому что мои симптомы идентичны, но решение кажется другим.

Я работаю в контейнере Ubuntu (Ubuntu 16.04.3 LTS), пытаюсь скомпилировать игрушечную программу на C, которая в конечном итоге подключится к серверу SQL. Перво-наперво: у меня установлена ​​последняя версия libmysqlclient-dev:

root@1234:/home# apt install libmysqlclient-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
libmysqlclient-dev is already the newest version (5.7.24-0ubuntu0.16.04.1).
0 upgraded, 0 newly installed, 0 to remove and 88 not upgraded.
root@1234:/home#

И когда я смотрю в каталог / usr / include / mysql, я вижу критический заголовочный файл, который мне понадобится:

root@1234:/home# ls -l /usr/include/mysql  | grep mysql.h
-rw-r--r-- 1 root root 29207 Oct  4 05:48 /usr/include/mysql/mysql.h
root@1234:/home#

Пока все хорошо. Теперь я нашел эту маленькую игрушечную программу из здесь :

#include <stdio.h>
#include "/usr/include/mysql/mysql.h"

int main() {
  MYSQL mysql;
  if(mysql_init(&mysql)==NULL) {
    printf("\nInitialization error\n");
    return 0;
  }
  mysql_real_connect(&mysql,"localhost","user","pass","dbname",0,NULL,0);
  printf("Client version: %s",mysql_get_client_info());
  printf("\nServer version: %s",mysql_get_server_info(&mysql));
  mysql_close(&mysql);
  return 1;
}

Теперь, следуя советам предыдущего поста, я компилирую, используя опцию "-I", чтобы указать на заголовочный файл mysql.h. (Да, я должен использовать GCC здесь):

root@1234:/home# gcc -I/usr/include/mysql sqlToy.c
/tmp/cc8c5JmT.o: In function `main':
sqlToy.c:(.text+0x25): undefined reference to `mysql_init'
sqlToy.c:(.text+0x69): undefined reference to `mysql_real_connect'
sqlToy.c:(.text+0x72): undefined reference to `mysql_get_client_info'
sqlToy.c:(.text+0x93): undefined reference to `mysql_get_server_info'
sqlToy.c:(.text+0xb4): undefined reference to `mysql_close'
collect2: error: ld returned 1 exit status
root@1234:/home#

Пупс! Компилятор понятия не имеет, что представляют собой все функции mySQL, хотя я сделал все, что мог, чтобы указать на этот заголовочный файл. В качестве проверки работоспособности я убедился, что эти функции mySQL действительно находятся в этом заголовочном файле; вот один в качестве примера:

root@1234:/home# more /usr/include/mysql/mysql.h | grep mysql_init
  libmysqlclient (exactly, mysql_server_init() is called by mysql_init() so
MYSQL *         STDCALL mysql_init(MYSQL *mysql);
root@1234:/home#

Итак, хотя я указал компилятору на файл заголовка mysql.h как в моем коде, так и с опцией "-I", он все еще не имеет ни малейшего представления, что это за функции mysql. Опция "-I" была решением в предыдущем посте, но здесь у меня не работает.

Итак ... В чем может быть проблема? Я предполагаю, что это не проблема компиляции, но, возможно, проблема с компоновкой? Другими словами, я показываю GCC, где находится файл mysql.h, но он все еще не использует его при обработке кода?

1 Ответ

0 голосов
/ 12 ноября 2018

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

Эти функции предоставляются библиотекой libmysqlclient, поэтому вам нужнодобавьте флаг -lmysqlclient в вашу командную строку, чтобы исправить это.(Обратите внимание, что это строчный l, а не I.)

Кроме того, поскольку вы добавляете /usr/include/mysql в путь к системному заголовку, вы можете включить библиотеку как

#include <mysql.h>

Вам не нужно - и не должно!- укажите полный путь к библиотеке в директиве #include.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...