5

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

yum install mysql
yum install mysql-devel

乃至

yum install mysql-libs

(由于这个线程。)

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

$ sudo find / -name libmysqlclient*

/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

ls -l /usr/lib64/mysql

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

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

编译器命令:

g++ main.cpp -L/usr/lib64/mysql -lmysqlclient.so.18.0.0

失败

/usr/bin/ld: cannot find -lmysqlclient.so.18.0.0
collect2: ld returned 1 exit status

所以有人在撒谎,或者我在 YUM 回购中被完全扯掉了,没有得到我libmysqlclient.a应该得到的。

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

4

2 回答 2

2

呸呸呸!你大错特错了

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

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

g++ main.cpp

undefined reference to `mysql_init'

但这可以用

g++ main.cpp `mysql_config --cflags --libs`
于 2013-04-11T21:08:23.983 回答
1

当您使用 .so 时,它们被链接到一个运行时。这使您的编译代码更小。这些天通常没什么大不了的。真正很棒的功能是,当您更新系统并更新库时,您将链接到新的(并且希望是)更好的库。更新通常包含错误修复和安全修复。可能的性能改进。因此,它们使您的代码更酷,并且间接地使您更酷。

于 2015-07-02T22:24:22.017 回答