我想在这帖子上构建,因为我的症状是相同的,但是解决方案似乎是其他的。
我正在一个Ubuntu容器(Ubuntu16.04.3LTS)中工作,试图编译一个最终连接到SQL服务器的玩具C程序。首先,我安装了最新的libmysqlclient:
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#因此,虽然我已经将编译器指向我的代码和"-I“选项中的mysql.h头文件,但它仍然不知道这些'mysql‘函数是什么。"-I“选项是上一篇文章中的解决方案,但在这里并不适用于我。
所以..。有什么问题吗?我假设这不是编译问题,也许是链接问题?换句话说,我正在向GCC展示mysql.h文件在哪里,但他在处理代码时仍然没有使用它?
发布于 2018-11-12 18:30:35
标题不是库。您在编译过程中包含了MySQL头,因此定义了这些函数,但是没有针对实际提供这些函数的库进行链接。
这些函数是由libmysqlclient库提供的,因此您需要将-lmysqlclient标志添加到命令行以解决这个问题。(请注意,这是小写l,而不是I。)
此外,由于要将/usr/include/mysql添加到系统头路径,所以可以将库包含为
#include <mysql.h>您不需要--也不应该!--在#include指令中指定到库的完整路径。
https://stackoverflow.com/questions/53267923
复制相似问题