2010-10-06 2 views
0

Контекст: Я не уверен, является ли это моей проблемой или проблемой сервера, на котором выполняется эта операция. Я пытаюсь скомпилировать и запустить небольшую утилиту, чтобы стать заданием cron, которое использует библиотеки mysql. Программа успешно компилируется с помощью следующей команды, никаких ошибок или предупреждений:Runtime «ошибка поиска символа» при доступе к функциям libmysqlclient.so в C

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), что может сделать администратор сервера, чтобы исправить эту проблему?

ответ

1

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

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

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

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

+0

Спасибо, но это приводит к той же ошибке :(Я понял, что, конечно же, есть libc.so.6 в/lib/path, который, как представляется, является вилкой Linux, но я не вижу файл, который может быть сам GLIBC_2.0 - может быть, это просто отсутствует? Что такое у этой библиотеки? – haslo

+1

'GLIBC_2.0' - это макрос, определенный в' libc.so.6'. Так что в вашей системе 'libc. so.6 является реализацией библиотеки библиотеки GNU.Если вы все еще сталкиваетесь с проблемами, очень возможно, что 'libmysqlclient.so.15' был создан против другой версии' libc.so.6' и ожидает появления разных символов. – birryree

1

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

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