编辑:我解决了我的问题- 我编辑了错误的包含文件。请参阅本文末尾的修复方法。
我正在将一些应用程序从旧的 FreeBSD 4.3 服务器迁移到新的 FreeBSD 10 服务器。这些是使用 MySQL C API 的 C 应用程序。它们非常老旧,并且使用函数mysql_connect
(在较新版本的 MySQL 中已弃用)。从我查看 MySQL 源代码所得到的信息来看,MySQL 客户端 API 需要用 进行编译USE_OLD_FUNCTIONS
。不幸的是,我不知道如何做到这一点。我正在尝试使用 FreeBSD 端口系统安装 MySQL 5.6。我做了以下操作,我认为应该可以工作:
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
答案1
我想我已经搞明白了。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