使用gcc的C代码无法链接到mysql标头吗?

时间:2018-11-12 18:18:31

标签: mysql c gcc compiler-errors shared-libraries

我想基于this发布信息,因为我的症状是相同的,但是解决方案似乎是另外一回事。

我正在Ubuntu容器(Ubuntu 16.04.3 LTS)中工作,试图编译一个玩具C程序,该程序最终将连接到SQL Server。首先,我已经安装了最新的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#

到目前为止,太好了。现在,我从here找到了这个小玩具程序:

#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文件所在的位置,但是他在处理代码时仍未使用它?

1 个答案:

答案 0 :(得分:1)

标头不是库。您将在编译过程中包括MySQL标头,因此已定义了这些功能,但未链接到实际提供这些功能的库。

这些功能由libmysqlclient库提供,因此您需要在命令行中添加-lmysqlclient标志以解决此问题。 (请注意,这是小写的l,而不是I。)

此外,由于要将/usr/include/mysql添加到系统头文件路径,因此可以将库包含为

#include <mysql.h>

您不需要-也不应该! -在#include指令中指定库的完整路径。