Название: Порядок линковки библиотек Отправлено: 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 она отвечает за ключи линкера. Ага, спасибо, помогло. Только удобнее использовать переменную LIBS, чтобы все либы вместе были. Вот так:Примерно так: QMAKE_LFLAGS += --start-group archives --end-group Цитировать LIBS += -Wl,--start-group -lA -lB -Wl,--end-group |