Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: frg10 от Май 14, 2010, 15:02



Название: Порядок линковки библиотек
Отправлено: frg10 от Май 14, 2010, 15:02
Есть проект экзешника. В нем используется несколько статических библиотек. Сами эти библиотеки зависят друг от друга.
Чтобы было понятнее:
1) В библиотеке libA объявлена функция f()
2) В библиотеке libB используется функция f() из libA

Когда использую студию, то собирается все нормально. А у mingw обнаружилась неприятная особенность: чтобы все успешно слинковалось, библиотеки нужно передавать в определенном порядке.
Если так: LIBS += -lA -lB то ld ругается что unresolved f()
Если LIBS += -lB -lA - все нормально.

Возникает вопрос: как эту "фичу" отключить, т.е. что нужно написать в pro-файле, чтобы ld не смотрел на порядок библиотек?

Мне нужно подключить еще 15 разных библиотек с подобными зависимостями и не хочется перебирать все варианты.

P.S. При сборке gcc под Linux все точно так же.


Название: Re: Порядок линковки библиотек
Отправлено: Авварон от Май 14, 2010, 16:38
сей баг только со статик либами. На маке гцц норм собирает независимо от порядка. Порядок вроде обратный использованию (сначала линкуем юзадж, потом деклрейшн) Хотя фича бесит, да...


Название: Re: Порядок линковки библиотек
Отправлено: frg10 от Май 15, 2010, 10:29
Природа сего бага мне вполне ясна. Вопрос в том, как его обойти.
У ld есть специальные опции:
Цитата: man ld
       -( archives -)
       --start-group archives --end-group
      The archives should be a list of archive files.  They may be either
      explicit file names, or -l options.

      The specified archives are searched repeatedly until no  new  unde-
      fined  references  are  created.   Normally, an archive is searched
      only once in the order that it is specified on  the   command  line.
      If  a symbol in that archive is needed to resolve an undefined sym-
      bol referred to by an object in an archive that  appears  later  on
      the command line, the linker would not be able to resolve that ref-
      erence.  By grouping the archives, they all be searched  repeatedly
      until all possible references are resolved.

      Using  this   option has a significant performance cost.  It is best
      to use it only  when  there   are  unavoidable  circular  references
      between two or more archives.

Но непонятно что написать в pro-файле, чтобы qmake сгенерил соответствующую командную строку.


Название: Re: Порядок линковки библиотек
Отправлено: lit-uriy от Май 15, 2010, 11:56
смотри переменную QMAKE_LFLAGS она отвечает за ключи линкера.
Примерно так:
QMAKE_LFLAGS += --start-group archives --end-group


Название: Re: Порядок линковки библиотек
Отправлено: frg10 от Май 16, 2010, 15:52
смотри переменную QMAKE_LFLAGS она отвечает за ключи линкера.
Примерно так:
QMAKE_LFLAGS += --start-group archives --end-group
Ага, спасибо, помогло. Только удобнее использовать переменную LIBS, чтобы все либы вместе были. Вот так:
Цитировать
LIBS += -Wl,--start-group -lA -lB -Wl,--end-group