2017-04-16 98 views
-1

我想开始使用mySQL C API来完成一个我希望完成的项目。mySQL和C的麻烦

我已经从官方网站下载了mySQL社区服务器版本和mySQL连接器/ C。

Q1:我是否还需要下载Connector/ODBC?有什么不同?

所以,这是我的经验和我试图编译和链接的基本程序:

#include<stdio.h> 
#include<mysql.h> 

int main(int argc, char **argv) 
{ 
    printf("MySQL client version: %s\n", mysql_get_client_info()); 

    exit(0); 
} 

我为编译什么命令和链接,我应该使用极其混乱。当我做以下事情时,会发生这种情况:

gcc mySQL.c -I/usr/local/mysql/include 
Undefined symbols for architecture x86_64: 
    "_mysql_get_client_info", referenced from: 
     _main in mySQL-a3f748.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

有人可以帮我解决这个问题吗?我挣扎了很多,这似乎很混乱。

我的问题是关于编译和链接mySQL C API库而不是错误。

+0

@Olaf我的代码在编译步骤中存在缺陷,这就是为什么关于错误的答案不能解决它的原因。 –

+0

这不是来自编译,而是链接。并且dup很好地回答你的问题!你甚至读过它吗? – Olaf

回答

1

头文件<mysql.h>只有声明需要的函数和类型。实际功能定义(其实现)位于您需要链接的库中。

你这样做,与-l(小写L)选项:

gcc mySQL.c -I/usr/local/mysql/include -lmysql 

但是,因为你似乎在非标准位置安装了MySQL,你可能需要使用-L选项指定库中的位置(类似于-I选项):

gcc mySQL.c -I/usr/local/mysql/include -L/usr/local/mysql/lib -lmysql 

这至少应该让你的程序的构建。但是如果你的MySQL库不是一个静态库而是一个动态库(即一个“DLL”),那么可能会出现另一个问题,因为运行时加载器不知道动态库的位置。你也需要一个特殊的链接器标志:

gcc mySQL.c -I/usr/local/mysql/include -L/usr/local/mysql/lib -lmysql -Wl,-rpath=usr/local/mysql/lib