«Ошибка поиска символа» во время выполнения при доступе к функциональности libmysqlclient.so в C

0

Контекст: Я не уверен, что это моя проблема или проблема сервера, на котором это работает. Я пытаюсь скомпилировать и запустить небольшую утилиту, чтобы стать заданием 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), что может сделать администратор сервера для устранения проблемы?

Теги:
gcc
libmysql

2 ответа

1

Мои извинения, я нашел проблему. На самом деле это не ошибка поиска символа, а ошибка сегментации. Поскольку я вызывал mysql_init с неинициализированным conn вместо NULL для инициализации, libmysqlclient должен был разбиться и по причинам, отличным от моего ограниченного знания C, вызвал неправильное сообщение об ошибке.

Отладка в другой системе с другой сборкой той же ОС вызвала правильную ошибку, что было намного легче отлаживать.

1

Попробуйте передать флаг -rdynamic на gcc.

Так как я не должен заливать комментарий:

GLIBC_2.0 - макрос, который определен в libc.so.6. Итак, в вашей системе libc.so.6 - реализация библиотеки GNU C.

Если вы все еще сталкиваетесь с проблемами, очень возможно, что libmysqlclient.so.15 был создан против другой версии libc.so.6 и ожидает появления разных символов. В этом случае вам, возможно, придется перестроить libmysqlclient.so из источника для связи с библиотеками в системе или посмотреть, есть ли обновленная версия для вашей платформы.

  • 0
    Спасибо, но это приводит к той же ошибке :( Я понял, что в / lib / path наверняка есть libc.so.6, который выглядит как ветвь Linux, но я не вижу файла, который мог бы быть Сам GLIBC_2.0 - может быть, этого просто не хватает? Какое имя у этой библиотеки обычно есть?
  • 1
    GLIBC_2.0 - это макрос, определенный в libc.so.6 . Итак, в вашей системе libc.so.6 - это реализация библиотеки GNU для C. Если вы все еще сталкиваетесь с проблемами, вполне возможно, что libmysqlclient.so.15 был libmysqlclient.so.15 с другой версией libc.so.6 и ожидает другие символы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню