上下文:我不确定这是我的问题还是正在运行的服务器的问题。我正在尝试编译并运行一个小实用程序,成为一个使用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
中使用它可以正常工作{1}}本身。
从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的其他地方使用),服务器的管理员可以做些什么来解决问题?
答案 0 :(得分:1)
尝试将-rdynamic
标记传递给gcc
。
因为我不应该淹没评论部分:
GLIBC_2.0
是libc.so.6
中定义的宏。所以在你的系统上,libc.so.6
是GNU的C库实现。
如果您仍然遇到问题,libmysqlclient.so.15
很可能是针对不同版本的libc.so.6
构建的,并且需要不同的符号。在这种情况下,您可能需要从源代码重建libmysqlclient.so
以与系统上的库链接,或者查看您的平台是否有可用的升级版本。
答案 1 :(得分:1)
道歉,我发现了问题。它实际上不是符号查找错误,而是分段错误。因为初始化时我使用未初始化的mysql_init
而不是conn
来调用NULL
,libmysqlclient
必须已经崩溃,并且由于我对C的了解有限的原因,产生了错误的错误信息。
在具有相同操作系统的不同版本的另一个系统上进行调试会产生正确的错误,这更容易调试。