C++ 当一个静态库依赖于另一个静态库时,是否需要指定链接依赖关系?

C++ 当一个静态库依赖于另一个静态库时,是否需要指定链接依赖关系?,c++,qt,static-libraries,qmake,C++,Qt,Static Libraries,Qmake,一般问题可以表述为-如果静态库lib1依赖于另一个静态库lib2,我是否需要将lib2指定为lib1的链接器依赖项,或者仅当库链接到某个应用程序时才需要指定链接依赖项(然后使用lib2的每个应用程序也应该链接到lib1) 具体来说,我有一堆静态lib和应用程序,它们之间有一些依赖关系,如: makeall.pro: TEMPLATE = subdirs CONFIG += ordered SUBDIRS = coreLib \ anotherLib \ .... some

一般问题可以表述为-如果静态库lib1依赖于另一个静态库lib2,我是否需要将lib2指定为lib1的链接器依赖项,或者仅当库链接到某个应用程序时才需要指定链接依赖项(然后使用lib2的每个应用程序也应该链接到lib1)

具体来说,我有一堆静态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
(nothing required)
PRE_TARGETDEPS += ../bin/coreLib.lib
PRE_TARGETDEPS += ../bin/coreLib.lib
#有问题的行

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
PRE_TARGETDEPS += ../bin/coreLib.lib ../bin/anotherLib.lib
PRE_TARGETDEPS += ../bin/coreLib.lib ../bin/anotherLib.lib
#有问题的行

有问题的行应该使用什么


anotherLib.pro

TEMPLATE = lib
CONFIG += staticlib
INCLUDEPATH += PATH_TO_CORE_LIB_INCLUDES
DEPENDPATH += PATH_TO_CORE_LIB_INCLUDES
TARGET = anotherLib
(nothing required)
PRE_TARGETDEPS += ../bin/coreLib.lib
PRE_TARGETDEPS += ../bin/coreLib.lib
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
PRE_TARGETDEPS += ../bin/coreLib.lib ../bin/anotherLib.lib
PRE_TARGETDEPS += ../bin/coreLib.lib ../bin/anotherLib.lib
或:


二,。anotherLib.pro

TEMPLATE = lib
CONFIG += staticlib
INCLUDEPATH += PATH_TO_CORE_LIB_INCLUDES
DEPENDPATH += PATH_TO_CORE_LIB_INCLUDES
TARGET = anotherLib
(nothing required)
PRE_TARGETDEPS += ../bin/coreLib.lib
PRE_TARGETDEPS += ../bin/coreLib.lib
someApp

PRE_TARGETDEPS += ../bin/anotherLib.lib


三、 anotherLib.pro

TEMPLATE = lib
CONFIG += staticlib
INCLUDEPATH += PATH_TO_CORE_LIB_INCLUDES
DEPENDPATH += PATH_TO_CORE_LIB_INCLUDES
TARGET = anotherLib
(nothing required)
PRE_TARGETDEPS += ../bin/coreLib.lib
PRE_TARGETDEPS += ../bin/coreLib.lib
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
PRE_TARGETDEPS += ../bin/coreLib.lib ../bin/anotherLib.lib
PRE_TARGETDEPS += ../bin/coreLib.lib ../bin/anotherLib.lib

最好的方法是尝试编译您的应用程序并查找编译错误,前提是您包含了所有使用过的外部库编译器是您最好的朋友。

在构建静态库时,您不需要链接到其他静态库中

在构建可执行文件时,需要包含代码所依赖的所有库和代码所依赖的库。图书馆通常需要有正确的顺序。如果lib-foo依赖于lib-c,那么必须使用-lfoo-lc


在遥远的过去,静态库中对象文件的顺序很重要,但仅此而已。

它以我所述的三种配置中的任何一种进行编译。我关心两件事——1。不要添加额外的依赖项。2.确保在修改库的soem时正确生成整个项目。如果某个库中的符号未被使用,则不必担心额外的依赖关系。编译器会自动丢弃这些符号,或者根本不会查看这些符号。为此,请查看编译器手册。另外,要管理库之间的依赖关系,请包括程序直接依赖的所有库以及库之间依赖的库--开始组和--结束组。有关更多信息,请查看手册页。非常好,谢谢!如果库的顺序错误-它根本不会链接,对吗?即使这些符号是在库中定义的,也会得到未定义的符号。包括库名称或--start group和--end group之间的路径将导致链接器不断查找库,直到解决所有依赖关系。