libmysqlclient.a 找不到

bob*_*obo 5 mysql g++

在 Amazon EC2 上(uname -r给出“3.4.37-40.44.amzn1.x86_64”,我听说它基于 Cent OS)我尝试安装:

yum install mysql
yum install mysql-devel
Run Code Online (Sandbox Code Playgroud)

乃至

yum install mysql-libs
Run Code Online (Sandbox Code Playgroud)

(由于这个线程。)

我正在尝试编译一个程序并将 MySQL 库链接到它。这在我的 Mac 上运行良好(但 Mac libmysqlclient.a)。 libmysqlclient.a在这台机器上绝对找不到。它所拥有的只是libmysqlclient.so,而且还有很多版本。

$ sudo find / -name libmysqlclient*
Run Code Online (Sandbox Code Playgroud)

给予

/usr/lib64/mysql/libmysqlclient_r.so
/usr/lib64/mysql/libmysqlclient.so
/usr/lib64/mysql/libmysqlclient.so.18
/usr/lib64/mysql/libmysqlclient.so.18.0.0
/etc/alternatives/libmysqlclient
/etc/alternatives/libmysqlclient_r
Run Code Online (Sandbox Code Playgroud)

ls -l /usr/lib64/mysql
Run Code Online (Sandbox Code Playgroud)

给予

lrwxrwxrwx 1 root root      34 Apr 11 19:21 libmysqlclient_r.so -> /etc/alternatives/libmysqlclient_r
lrwxrwxrwx 1 root root      32 Apr 11 19:21 libmysqlclient.so -> /etc/alternatives/libmysqlclient
lrwxrwxrwx 1 root root      24 Apr 11 18:24 libmysqlclient.so.18 -> libmysqlclient.so.18.0.0
-rwxr-xr-x 1 root root 2983360 Mar 14 10:09 libmysqlclient.so.18.0.0
-rwxr-xr-x 1 root root   11892 Mar 14 09:12 mysqlbug
-rwxr-xr-x 1 root root    7092 Mar 14 10:08 mysql_config
Run Code Online (Sandbox Code Playgroud)

所以唯一真实的文件是libmysqlclient.so.18.0.0.

编译器命令:

g++ main.cpp -L/usr/lib64/mysql -lmysqlclient.so.18.0.0
Run Code Online (Sandbox Code Playgroud)

失败与

/usr/bin/ld: cannot find -lmysqlclient.so.18.0.0
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

所以有人在撒谎,或者我在 YUM 仓库完全被骗了,并且没有得到我libmysqlclient.a应该得到的东西。

(我避免使用系统上的许多符号链接,这样我就可以消除可能的问题)。

bob*_*obo 2

波波波波!你错

首先,当您拥有 .so 文件时,您不需要 libmysqlclient.a 文件。 .a 文件用于静态链接,.so 文件用于动态链接。。.so 文件显然更好并且让你更酷。

当您尝试在没有库链接的情况下进行编译时遇到的问题是

g++ main.cpp
Run Code Online (Sandbox Code Playgroud)

给予

undefined reference to `mysql_init'
Run Code Online (Sandbox Code Playgroud)

但这可以解决

g++ main.cpp `mysql_config --cflags --libs`
Run Code Online (Sandbox Code Playgroud)