Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Общий по Linux (http://forum.oszone.net/forumdisplay.php?f=9)
-   -   Функции в gcc (http://forum.oszone.net/showthread.php?t=12672)

Dimonweb 04-07-2004 03:28 67173

Привет всем! В общем, у меня проблема в gcc под Asp Linux 7.3 и 9.0. Например, я делаю #include <mysql/mysql.h>, потом вызываю функцию mysql_connect(...) , либо какую-нибуль иную. Компиляю файл, проходит нормально. А вот сборка не завершается успехом и выдается сообщение типа "Undefined reference to mysql_connect". Это же происходит и с glut'ом, SDL'ем и даже в хедерах с++(stream.h, iostream.h).
Если кто знает, что делать с этою проблемой, помогите!

ruslandh 04-07-2004 06:03 67174

Хорошо-бы последние строчки лога посотреть :)

Figaro 04-07-2004 12:12 67175

Подключения одних хедеров недостаточно. Нужно еще подключать динамическую библиотеку, в которой находятся откомпилированные функции.  Если я правильно понял, то вот такая строчка
Код:

gcc -c  test.c  
проходит и создает файл test.o. Зато
Код:

gcc -o test  test.o  
выдает указанную ошибку.
Можно попробовать сделать так:
Код:

gcc -o test -lmysqlclient test.o  
Здесь  опция -lmysqlclient указывает, что нужно подключить файл
libmysqlclient.so или libmysqlclient.a из стандартных путей (записаны в /etc/ld.so.conf).
Правда, тут есть другая проблема:
Хотя в заголовочных файлах mysql_connect присутствует, в библиотеке этой функции  нет (используя nm, можно посмотреть ее содержимое). Кроме того, в самом заголовке (по крайней мере, в моей версии) написано так:

Код:


#ifdef USE_OLD_FUNCTIONS
 
MYSQL *         STDCALL mysql_connect(MYSQL *mysql, const char *host,
                                      const char *user, const char *passwd);
/* ....  */
#endif

что наводит на размышления о том, что эти функции устарели (возможно, вместо них теперь нужно  использовать mysql_manager_connect или mysql_real_connect)

Кстати, о динамических библиотеках и компиляции с помощью gcc можно читать вот тут.

makaveli lcf 06-07-2004 09:53 67176

кстати =  какие существуют способы (традиционные, если так можно выразиться) поиска библиотек, в которых находится нужная функция?
я напролом пользуюсь
grep function_name /usr/lib/lib*so*

а потом выбираю по смыслу))) просто некоторые функции встречаются в разных библиотеках (програмка использующая glut требует подключения штук трех - четырех иксовых библиотек, вот и ищешь, где что лежит)

hasherfrog 06-07-2004 11:18 67177

makaveli lcf
Как вариант:
for a in [ /usr/lib/lib*.so ] ; do echo $a ; objdump -R -C $a | grep что-ищем ; done

Figaro 06-07-2004 11:37 67178


Цитата:

какие существуют способы (традиционные, если так можно выразиться) поиска библиотек, в которых находится нужная функция?
Меня самого тоже очень это интересует :)

Я могу только предложить еще искать не во всех .so файлах, а только в тех, которые находятся в одном пакете с заголовочными (ну, или если заголовки в packagename-devel, то библиотеки будут в packagename).

makaveli lcf 08-07-2004 10:07 67179

Figaro
в принципе так, но когда я сделал лишь
-lglut

как потом выяснилось, потребовалось
-lXmu -lGl и так далее... но это видимо редкий случай...


Время: 01:08.

Время: 01:08.
© OSzone.net 2001-