0

上下文:我不确定这是我的问题还是正在运行的服务器的问题。我正在尝试编译并运行一个小实用程序,以成为一个使用 mysql 库的 cron 作业。该程序使用以下命令成功编译,没有错误或警告:

gcc my_program.c -o my_program -I /usr/include/mysql/ -L/usr/include/mysql -lmysqlclient -lglib-2.0 -Wall

我补充说-lglib-2.0因为...

问题:当我尝试运行程序时,它中止并出现以下错误:

./my_program: symbol lookup error: /usr/lib/libmysqlclient.so.15: undefined symbol: strcpy, version GLIBC_2.0

错误发生在运行时,在以下行中:

conn = mysql_init(conn);

conn被声明为MYSQL *conn;,这是我第一次使用 mysql.h 中的任何内容(声明除外),strcpy如果我自己使用它就可以正常工作my_program.c

链接的库libmysqlclient.so.15是:

ldd /usr/lib/libmysqlclient.so.15
    linux-gate.so.1 =>  (0xb7ef6000)
    libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7cf4000)
    libcrypt.so.1 => /lib/tls/i686/cmov/libcrypt.so.1 (0xb7cc2000)
    libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 (0xb7ca9000)
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7c84000)
    libz.so.1 => /usr/lib/libz.so.1 (0xb7c6f000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7b20000)
    /lib/ld-linux.so.2 (0xb7ef7000)

我可以在我的代码中做些什么,我的编译或链接参数是否丢失了某些东西,或者libmysqlclient.so.15库本身内的库的动态链接是否存在问题?如果是后者(考虑到 mysql 库在服务器 AFAIK 的其他地方使用,我不认为),服务器的管理员可以做些什么来解决这个问题?

4

2 回答 2

1

尝试将-rdynamic标志传递给gcc.

因为我不应该淹没评论部分:

GLIBC_2.0是在 中定义的宏libc.so.6。所以在你的系统上,libc.so.6是 GNU 的 C 库实现。

如果您仍然遇到问题,很可能libmysqlclient.so.15是针对不同版本构建的libc.so.6并且需要不同的符号。在这种情况下,您可能必须libmysqlclient.so从源代码重新构建以与系统上的库链接,或者查看是否有可用于您的平台的升级版本。

于 2010-10-12T06:30:32.630 回答
1

抱歉,我发现了问题。这实际上不是符号查找错误,而是分段错误。因为我mysql_init用未初始化conn而不是NULL初始化调用,所以libmysqlclient一定是崩溃了,并且由于我对 C 的有限知识之外的原因,产生了错误的错误消息。

在具有相同操作系统的不同构建的另一个系统上进行调试会产生正确的错误,这更容易调试。

于 2010-10-12T12:08:59.963 回答