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