Qmake项目依赖项(链接库)
我有一个链接到一些共享库的项目。
可以说,项目A取决于项目B和C.
理想情况下,我想强制在我的项目文件中的以下依赖项:
- 重build项目A如果B或C自上次构build项目A以来已重build
- 使用相关configuration的输出(例如,如果在debugging模式下构build项目A,则使用项目B和C的库的debugging版本)
有谁知道我可以明确expression这种依赖项在我的项目文件?
经过qmake的一番沮丧之后,我发现我认为是你的问题的答案。 如果没有,那么我已经学会了使用qmake的方式,直到我find更好的东西,因为这仍然有点难看。 我设置了一个演示项目,这是我的目录结构(文件有扩展名,文件夹没有):
MyProj MyProj.pro myproj-core myproj-core.pro globals.h MyProjCore.h MyProjCore.cpp myproj-app myproj-app.pro main.cpp
我们从MyProj.pro
开始,作为一个子项目,这是做你要求的关键。 基本上,而不是依赖于其他项目指定debugging/释放和各种其他垃圾,你只需将其设置在一个qmake文件。 它不会让你只做你需要的东西,但这是我能想到的最好的解决scheme。 这里是内容:
TEMPLATE = subdirs # Needed to ensure that things are built right, which you have to do yourself :( CONFIG += ordered # All the projects in your application are sub-projects of your solution SUBDIRS = myproj-core \ myproj-app # Use .depends to specify that a project depends on another. myproj-app.depends = myproj-core
myproj-core.pro
是您典型的共享对象库:
QT -= gui TARGET = myproj-core TEMPLATE = lib DEFINES += MYPROJCORE_LIBRARY SOURCES += MyProjCore.cpp HEADERS += MyProjCore.h \ globals.h
myproj-app.pro
是消费者应用程序,其中很less重build的时候就是:
QT -= gui TARGET = myproj-app CONFIG += console CONFIG -= app_bundle TEMPLATE = app # Specify that we're lookin in myproj-core. Realistically, this should be put # in some configuration file INCLUDEPATH += ../myproj-core # Link to the library generated by the project. Could use variables or # something here to make it more bulletproof LIBS += ../myproj-core/libmyproj-core.so # Specify that we depend on the library (which, logically would be implicit from # the fact that we are linking to it) PRE_TARGETDEPS += ../myproj-core/libmyproj-core.so SOURCES += main.cpp
我希望这解决了你的问题,因为我知道它解决了我的!
编辑 :我build立了一个文件专门为我build立的依赖关系,我把它存储在我的每个项目(在上面指定的目录结构MyProj的孩子)的兄弟文件夹称为dependencies.pri
:
# On windows, a shared object is a .dll win32: SONAME=dll else: SONAME=so # This function sets up the dependencies for libraries that are built with # this project. Specify the libraries you need to depend on in the variable # DEPENDENCY_LIBRARIES and this will add for(dep, DEPENDENCY_LIBRARIES) { #message($$TARGET depends on $$dep ($${DESTDIR}/$${dep}.$${SONAME})) LIBS += $${DESTDIR}/lib$${dep}.$${SONAME} PRE_TARGETDEPS += $${DESTDIR}/lib$${dep}.$${SONAME} }
所以在所有消费应用程序的底部,我可以添加行:
DEPENDENCY_LIBRARIES = myproj-core include(../config/dependencies.pri)
这假设你正在将库复制到某个共享位置和/或根据需要移动它们,所以我的函数可能不适合你,但我想我会将它添加到解决scheme中。
我使用下面的解决scheme。 这可以在没有使用子目录模板的情况下使用额外的.pro文件。
TEMPLATE = app TARGET = MyApp PRE_TARGETDEPS = ../../libs/MyLib/MyLib.a INCLUDEPATH += ../../libs/MyLib/include HEADERS += src/MyApp.h \ ../../libs/MyLib/incude/MyLib.h SOURCES += src/MyApp.cpp LIBS += ../../libs/MyLib/MyLib.a MyLib.target = ../../libs/MyLib/MyLib.a MyLib.commands = cd ../../libs/MyLib && make MyLib.depends = ../../libs/MyLib/Makefile QMAKE_EXTRA_TARGETS += MyLib
- 看看这个问题: 在QT Creator中构build时强制重新链接
-
尝试添加类似于这个代码的东西到你的pro文件中:
CONFIG(debug, debug|release) { DESTDIR = ../../../bin/debug OBJECTS_DIR = ./debug } else { DESTDIR = ../../../bin/release OBJECTS_DIR = ./release }
那么你将不得不为每个configuration指定依赖关系:
CONFIG(debug, debug|release) { LIBS += -L../../../lib/debug \ -L../../../bin/debug \ -llib1 \ -llib2 PRE_TARGETDEPS += ../../../lib/debug/liblib1.a \ ../../../lib/debug/liblib2.a else { LIBS += -L../../../lib/release \ -L../../../bin/release \ -llib1 \ -llib2 PRE_TARGETDEPS += ../../../lib/release/liblib1.a \ ../../../lib/release/liblib2.a }
当我移动一个新的DLL(pqXDot)一个可重用的类(来自pqGraphviz)后,我有重构我的项目时,这个问题。
在添加一个新的DLL到我的项目,并添加新的DLL引用到其他需要它的DLL和应用程序,我在主要.pro:
TEMPLATE = subdirs SUBDIRS += \ pqConsole \ pqConsoleTest \ pqSource \ pqSourceTest \ fdqueens \ pqGraphviz \ pqGraphvizTest \ pqXDot
并重build导致链接器错误,因为pqGraphviz,重新调整的DLL,找不到pqXDot,新的DLL。
事实certificate,对SUBDIRS列表重新sorting就足够了,将所需的DLL移到依赖的DLL之前:
SUBDIRS += \ pqConsole \ pqConsoleTest \ pqSource \ pqSourceTest \ fdqueens \ pqXDot \ pqGraphviz \ pqGraphvizTest
对于那些对Qt / QML项目模板感兴趣的人,我已经在GitHub QmlAppTemplate上发布了一个模板。