Назад | Перейти на главную страницу

Как скомпилировать mysql56-client для USE_OLD_FUNCTIONS на FreeBSD 10?

РЕДАКТИРОВАТЬ: я решил свою проблему - Я редактировал неправильный включаемый файл. См. Исправление в конце этого сообщения.

Я переношу некоторые приложения со старого сервера FreeBSD 4.3 на новый сервер FreeBSD 10. Это приложения C, которые используют MySQL C. API. Они очень-очень старые и используют mysql_connect функция (которая устарела в новых версиях MySQL). Из того, что я могу понять, глядя на исходный код MySQL, клиентский API MySQL должен быть скомпилирован с USE_OLD_FUNCTIONS. К сожалению, я не могу понять, как это сделать. Я пытаюсь установить MySQL 5.6 с системой портов FreeBSD. Я сделал следующее, и думаю, должно работать:

cd /usr/ports/databases/mysql56-client
make fetch
make extract
make configure

Затем я отредактировал work/mysql-5.6.16/include/config.h и в самом конце добавил следующую строку:

#define USE_OLD_FUNCTIONS

Затем я скомпилировал и установил клиент:

make
make install

mysql_config показывает следующее:

# mysql_config --libs
-L/usr/local/lib/mysql -lmysqlclient  -pthread -lm
# mysql_config --cflags
-I/usr/local/include/mysql -pipe -fno-strict-aliasing -g -DNDEBUG

Когда я пытаюсь скомпилировать очень простой тестовый клиент, показанный ниже, я получаю сообщение об ошибке компоновщика, в котором говорится undefined reference to 'mysql_connect'. Код тестового клиента выглядит следующим образом:

#define USE_OLD_FUNCTIONS
#include <mysql.h>
#include <stdio.h>
#include <stdlib.h>
main()
{
  MYSQL *sock;
  sock = mysql_connect(NULL, NULL, "root", "test");
  mysql_close(sock);
}

Когда я пытаюсь его скомпилировать, я получаю сообщение об ошибке компоновщика:

# clang -o test -I/usr/local/include/mysql -pipe -fno-strict-aliasing -g -DNDEBUG test.c -L/usr/local/lib/mysql -lmysqlclient -pthread -lm
/tmp//ccTJC9Ov.o: In function `main':
/root/admin/test.c:8: undefined reference to `mysql_connect'
collect2: ld returned 1 exit status

Следующая тестовая программа, в которой используется более новый mysql_real_connect функция, отлично компилируется с теми же аргументами компилятора и работает без ошибок:

#include <mysql.h>
#include <stdio.h>
#include <stdlib.h>
main()
{
  MYSQL *sock;
  sock = mysql_init(NULL);
  mysql_real_connect(sock, NULL, "root", "test", NULL, 0, NULL, 0);
  mysql_close(sock);
}

Есть идеи, где я ошибаюсь? Документация MySQL для USE_OLD_FUNCTIONS кажется несуществующим. Я не могу их винить, так как эти функции устарели для длинный время, но код все еще там.

Решение:

Думаю, я разобрался. Вместо редактирования work/mysql-5.6.16/include/config.h, Я должен был отредактировать work/mysql-5.6.16/include/my_config.h. Я добавил следующее в последний файл, перекомпилировал MySQL, и моя тестовая программа теперь компилируется и дает ссылки.

#define USE_OLD_FUNCTIONS

Обратите внимание, что я добавил это в my_config.h незадолго до последнего #endif в файле. Надеюсь, это поможет кому-то другому в будущем.

Я думаю, что разобрался. Вместо редактирования work/mysql-5.6.16/include/config.h, Я должен был отредактировать work/mysql-5.6.16/include/my_config.h. Я добавил следующее в последний файл, перекомпилировал MySQL, и моя тестовая программа теперь компилируется и дает ссылки.

#define USE_OLD_FUNCTIONS

Обратите внимание, что я добавил это в my_config.h незадолго до последнего #endif в файле. Надеюсь, это поможет кому-то другому в будущем.