2013-05-02 2 views
0

Общий вопрос может быть сформулирован как: если статическая библиотека lib1 зависит от другой статической библиотеки lib2, мне нужно указать lib2 как зависимость компоновщика для lib1, или привязка зависимостей должна быть указана только тогда, когда библиотеки связаны с некоторым приложением (и то каждое приложение, использующее lib2, должно также связываться с lib1)?Указывает зависимость ссылки, требуемую, когда один статический lib зависит от другого статического lib?

В частности, у меня есть куча статических библиотек и в приложениях, с некоторыми зависимостями между ними, как это:

makeall.pro:

TEMPLATE = subdirs 
CONFIG += ordered 
SUBDIRS = coreLib \ 
    anotherLib \ 
    .... 
    someApp 

anotherLib.depends = coreLib 
someApp.depends = coreLib anotherLib 

coreLib.pro

TEMPLATE = lib 
CONFIG += staticlib 
TARGET = coreLib 
#... some .cpp and .h 

anotherLib .pro

TEMPLATE = lib 
CONFIG += staticlib 
INCLUDEPATH += PATH_TO_CORE_LIB_INCLUDES 
DEPENDPATH += PATH_TO_CORE_LIB_INCLUDES 
TARGET = anotherLib 

в вопросе Строки,

someApp.pro

TEMPLATE = app 
DESTDIR = ..\bin 
INCLUDEPATH += PATH_TO_CORE_LIB_INCLUDES PATH_TO_ANOTHER_LIB_INCLUDES 
DEPENDPATH += PATH_TO_CORE_LIB_INCLUDES PATH_TO_ANOTHER_LIB_INCLUDES 

в вопросе Строки,

Что я должен использовать для линий в вопросе:


anotherLib.pro

(nothing required) 

someApp.pro

PRE_TARGETDEPS += ../bin/coreLib.lib ../bin/anotherLib.lib 

ИЛИ:


II. anotherLib.pro

PRE_TARGETDEPS += ../bin/coreLib.lib 

someApp

PRE_TARGETDEPS += ../bin/anotherLib.lib 

ИЛИ


III. anotherLib.pro

PRE_TARGETDEPS += ../bin/coreLib.lib 

someApp.pro

PRE_TARGETDEPS += ../bin/coreLib.lib ../bin/anotherLib.lib 

ответ

2

При создании статической библиотеки вам не нужно связываться в других статических библиотеках.

При создании исполняемого файла вам необходимо включить все библиотеки вашего кода и библиотеки, от которых зависит ваш код. Обычно библиотеки должны быть в правильном порядке. Если lib foo зависит от lib c, вы должны использовать -lfoo -lc.

В далеком прошлом порядок объектных файлов в статической библиотеке был важен, но не более.

+0

Отлично, спасибо! Если библиотеки находятся в неправильном порядке - это просто не будет ссылка, не так ли? –

+0

Вы получите undefined символы, даже если символы определены в библиотеке. –

+1

, включая имена вашей библиотеки или путь между --start-group и -end-group, заставит ваш компоновщик постоянно просматривать ваши библиотеки до тех пор, пока не будут разрешены все зависимости. – Barracuda

0

лучший способ выяснить это попытаться скомпилировать приложение и искать ошибки компиляции условии, что вы включили все внешние библиотеки, которые Вы использовали. Компилятор - ваш лучший друг.

+0

Он компилируется в любой из трех конфигураций, которые я изложил. Меня беспокоят 2 вещи - 1. не добавлять дополнительные зависимости. 2. Обеспечьте правильную сборку всего проекта, когда изменяется количество библиотек. –

+0

вам не нужно беспокоиться о дополнительных зависимостях, если символы в одной из ваших библиотек не используются, они автоматически отбрасываются вашим компилятором или вообще не смотрели на проверку руководства вашего компилятора. также для управления зависимостями между библиотеками включают все из них, от которых зависит ваша программа, и те, от которых зависят ваши библиотеки, от -start-group и -end-group для дополнительной проверки информации 'ld' man-страницы. – Barracuda

Смежные вопросы