Контекст: Я не уверен, что это моя проблема или проблема сервера, на котором это работает. Я пытаюсь скомпилировать и запустить небольшую утилиту, чтобы стать заданием cron, которое использует библиотеки mysql. Программа успешно компилируется с помощью следующей команды: никаких ошибок или предупреждений:
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), что может сделать администратор сервера для устранения проблемы?
Мои извинения, я нашел проблему. На самом деле это не ошибка поиска символа, а ошибка сегментации. Поскольку я вызывал mysql_init
с неинициализированным conn
вместо NULL
для инициализации, libmysqlclient
должен был разбиться и по причинам, отличным от моего ограниченного знания C, вызвал неправильное сообщение об ошибке.
Отладка в другой системе с другой сборкой той же ОС вызвала правильную ошибку, что было намного легче отлаживать.
Попробуйте передать флаг -rdynamic
на gcc
.
Так как я не должен заливать комментарий:
GLIBC_2.0
- макрос, который определен в libc.so.6
. Итак, в вашей системе libc.so.6
- реализация библиотеки GNU C.
Если вы все еще сталкиваетесь с проблемами, очень возможно, что libmysqlclient.so.15
был создан против другой версии libc.so.6
и ожидает появления разных символов. В этом случае вам, возможно, придется перестроить libmysqlclient.so
из источника для связи с библиотеками в системе или посмотреть, есть ли обновленная версия для вашей платформы.
GLIBC_2.0
- это макрос, определенный вlibc.so.6
. Итак, в вашей системеlibc.so.6
- это реализация библиотеки GNU для C. Если вы все еще сталкиваетесь с проблемами, вполне возможно, чтоlibmysqlclient.so.15
былlibmysqlclient.so.15
с другой версиейlibc.so.6
и ожидает другие символы.