Russian Qt Forum
Сентябрь 30, 2024, 18:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Порядок линковки библиотек  (Прочитано 4424 раз)
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 все точно так же.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Май 14, 2010, 16:38 »

сей баг только со статик либами. На маке гцц норм собирает независимо от порядка. Порядок вроде обратный использованию (сначала линкуем юзадж, потом деклрейшн) Хотя фича бесит, да...
Записан
frg10
Гость
« Ответ #2 : Май 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 сгенерил соответствующую командную строку.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Май 15, 2010, 11:56 »

смотри переменную QMAKE_LFLAGS она отвечает за ключи линкера.
Примерно так:
QMAKE_LFLAGS += --start-group archives --end-group
Записан

Юра.
frg10
Гость
« Ответ #4 : Май 16, 2010, 15:52 »

смотри переменную QMAKE_LFLAGS она отвечает за ключи линкера.
Примерно так:
QMAKE_LFLAGS += --start-group archives --end-group
Ага, спасибо, помогло. Только удобнее использовать переменную LIBS, чтобы все либы вместе были. Вот так:
Цитировать
LIBS += -Wl,--start-group -lA -lB -Wl,--end-group
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.044 секунд. Запросов: 20.