Qmake项目依赖项(链接库)

Sti*_*MAN 44 qt qmake

我有一个链接到许多共享库的项目.

让我们说项目A取决于项目B和C.

理想情况下,我想在我的项目文件中强加以下依赖项:

  1. 如果自上次构建项目A以来重建了B或C,则重建项目A.
  2. 使用输出进行相关配置(即,如果在调试模式下构建项目A,则使用项目B和C的库的调试版本)

有谁知道我如何在我的项目文件中明确表达这种依赖?

Tra*_*kel 59

在对qmake感到非常沮丧之后,我发现了我认为你问题的答案.如果没有,那么我已经学会了使用qmake的方式,直到找到更好的东西,因为这仍然有点难看.我设置了一个演示项目,这是我的目录结构(文件有扩展名,文件夹没有):

MyProj
    MyProj.pro
    myproj-core
        myproj-core.pro
        globals.h
        MyProjCore.h
        MyProjCore.cpp
    myproj-app
        myproj-app.pro
        main.cpp
Run Code Online (Sandbox Code Playgroud)

我们从MyProj.pro一个subdirs项目开始,这是做你要求的关键.基本上,您只需将其设置在一个qmake文件上,而不是依赖于其他项目来指定调试/发布和各种其他垃圾.它不会让你只做你需要的东西,但它是我能想到的最好的解决方案.以下是内容:

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
Run Code Online (Sandbox Code Playgroud)

myproj-core.pro 是典型的共享对象库:

QT -= gui
TARGET = myproj-core
TEMPLATE = lib
DEFINES += MYPROJCORE_LIBRARY
SOURCES += MyProjCore.cpp
HEADERS += MyProjCore.h \
           globals.h
Run Code Online (Sandbox Code Playgroud)

myproj-app.pro 是消费者应用程序,其中需要重建的小技巧是:

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
Run Code Online (Sandbox Code Playgroud)

我希望这能解决你的问题,因为我知道这解决了我的问题!

编辑:我创建了一个专门为我构建依赖项的文件,我将它存储在我的每个项目(上面指定的目录结构中的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}
}
Run Code Online (Sandbox Code Playgroud)

所以在所有消费应用程序的底部,我可以添加以下行:

DEPENDENCY_LIBRARIES = myproj-core

include(../config/dependencies.pri)
Run Code Online (Sandbox Code Playgroud)

这假设您正在将库复制到某个共享位置和/或根据需要移动它们,因此我的功能可能不适合您,但我想我会将其添加到解决方案中.


Jer*_*oen 8

我使用下面的解决方案.这不需要使用带有subdir模板的额外.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
Run Code Online (Sandbox Code Playgroud)

  • 如果您的库不是qmake项目,这非常棒.谢谢! (2认同)

rpg*_*rpg 5

  1. 看看这个问题:在QT Creator中构建时强制重新链接
  2. 尝试在您的专业文件中添加与此代码类似的内容:

    CONFIG(debug, debug|release) {   
        DESTDIR = ../../../bin/debug  
        OBJECTS_DIR = ./debug  
    }  
    else {   
        DESTDIR = ../../../bin/release  
        OBJECTS_DIR = ./release  
    }
    
    Run Code Online (Sandbox Code Playgroud)

然后,您必须为每个配置指定依赖项:

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 
}
Run Code Online (Sandbox Code Playgroud)