Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > gcc проблемы с подключением библиотек


Автор: EvgeniyK77 19.8.2006, 08:20
Привет!

Недавно занялся программированием под QNX 6 (компилятор gcc (версия 2.xxx)). И столкнулся с проблемой подключения библиотек (если они пользуются функциями друг друга) при создании исполняемого файла.

Вот простой пример. 

- Создал библиотеку 1 (libsimple1.a). Пусть она состоит из единственной функции int Fun1(), которая просто вернёт единицу.

- Создал библиотеку 2 (libsimple2.a). Она также включает в себя единств. ф-ю int Fun2(). Но эта ф-я пользуется ф-й Fun1 из первой библиотеки, например возвращает Fun1() + 2.

- Теперь пытаюсь собрать программу (simple_prog), которая ... да хоть просто распечатает то, что вернёт Fun2 из второй библиотеки.  Так вот, если в строке линковки этой simple_prog указать сначала -lsimple2 -lsimple1, то всё прекрасно линкуется, а если библиотеки поменять местами (-lsimple1 -lsimple2), то линковщик выдаёт undefined reference.

Так вот вопрос то. Как указать линковщику, что бы он "лучше" просматривал подключаемые библиотеки?

PS Реально ситуация неприятнее. У меня есть три библиотеки и они пользуются функциями друг друга. Когда компилировал watcom-овским компилятором под QNX 4, то проблем не было.


Автор: Serge 19.8.2006, 11:05
Цитата(EvgeniyK77 @ 19.8.2006,  08:20)

...
- Теперь пытаюсь собрать программу (simple_prog), которая ... да хоть просто распечатает то, что вернёт Fun2 из второй библиотеки.  Так вот, если в строке линковки этой simple_prog указать сначала -lsimple2 -lsimple1, то всё прекрасно линкуется, а если библиотеки поменять местами (-lsimple1 -lsimple2), то линковщик выдаёт undefined reference.

Так вот вопрос то. Как указать линковщику, что бы он "лучше" просматривал подключаемые библиотеки?

Это нормальное поведение gcc.. 
Цитата(Программирование для Linux. Профессиональный подход.)

Иногда между двумя библиотеками образуется зависимость. Другими словами , первый архив ссылается на символические константы, определенные во втором архиве, и наоборот. Такая ситуация, как правило, является следствием неправильного проектирования. В этом случае нужно указать в командной строке одну и ту же библиотеку несколько раз. Компоновщик просмотрит библиотеку столько раз, сколько она присутствует в командной строке. Пример:

Код

gcc -o app app.o -lfoo -lbar -lfoo


Теперь, даже если библиотека libfoo.a ссылается на символические константы в библиотеке libbar.a и наоборот, программа будет успешно скомпилирована.

Автор: bilbobagginz 19.8.2006, 17:42
видимо пришло время познакомиться с разницей между статическим архивом функлий *.a и динамически связываемой библиотекой, *.so

пока.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)