Подтвердить что ты не робот

Зависимости проекта Qmake (связанные библиотеки)

У меня есть проект, который ссылается на несколько разделяемых библиотек.

Допустим, что проект A зависит от проектов B и C

В идеале я хочу наложить следующие зависимости в файле проекта:

  • Перестроить проект A, если B или C был восстановлен с момента создания проекта A
  • Используйте выходные данные для соответствующей конфигурации (т.е. при построении проекта A в режиме отладки, затем используйте отладочные версии библиотек для проектов B и C)

Кто-нибудь знает, как я могу явно выражать такие зависимости в файле проекта?

4b9b3361

Ответ 1

После некоторого разочарования qmake я нашел то, что, на мой взгляд, ответ на ваш вопрос. Если нет, то я узнал, как буду использовать qmake, пока не найду что-то лучше, потому что это все еще немного уродливо. Я создал демо-проект, это моя структура каталогов (файлы имеют расширения, папки не работают):

MyProj
    MyProj.pro
    myproj-core
        myproj-core.pro
        globals.h
        MyProjCore.h
        MyProjCore.cpp
    myproj-app
        myproj-app.pro
        main.cpp

Начнем с MyProj.pro в качестве проекта subdirs, который является ключом к выполнению заданий. В принципе, вместо того, чтобы в зависимости от других проектов указывать debug/release и всевозможные другие нежелательные файлы, вы просто устанавливаете его в один файл 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

myproj-core.pro - это ваша типичная библиотека общих объектов:

QT -= gui
TARGET = myproj-core
TEMPLATE = lib
DEFINES += MYPROJCORE_LIBRARY
SOURCES += MyProjCore.cpp
HEADERS += MyProjCore.h \
           globals.h

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

Надеюсь, это решит вашу проблему, поскольку я знаю, что она решила мою проблему.

РЕДАКТИРОВАТЬ. Я создал файл специально для создания зависимостей для меня, я храню его в отдельной папке каждого из моих проектов (дочерний объект 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)

Предполагается, что вы копируете библиотеки в какое-то разделяемое место и/или перемещаете их по мере необходимости, поэтому моя функция может не работать для вас, но я решил, что добавлю ее в решение.

Ответ 2

Я использую решение ниже. Это работает без использования дополнительного файла .pro с шаблоном subdir.

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

Ответ 3

Затем вам нужно будет указать зависимости для каждой конфигурации:

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 
}

Ответ 4

У меня возникла эта проблема при реорганизации моего проекта после того, как я перешел в новый DLL (pqXDot) класс многократного использования (из pqGraphviz).

После добавления новой DLL в мой проект и добавления новой ссылки DLL к другим DLL-приложениям и приложениям, которые в ней нуждались, у меня было в основном .pro:

TEMPLATE = subdirs

SUBDIRS += \
    pqConsole \
    pqConsoleTest \
    pqSource \
    pqSourceTest \
    fdqueens \
    pqGraphviz \
    pqGraphvizTest \
    pqXDot

и rebuild вызвал ошибку компоновщика, потому что pqGraphviz, реструктурированная DLL, не может найти pqXDot, новую DLL.

Оказывается, достаточно переупорядочить список SUBDIRS, перемещая нужную DLL до зависимого:

SUBDIRS += \
    pqConsole \
    pqConsoleTest \
    pqSource \
    pqSourceTest \
    fdqueens \
    pqXDot \
    pqGraphviz \
    pqGraphvizTest

Ответ 5

Для тех, кто заинтересован в шаблоне для вашего проекта Qt/QML, я опубликовал один шаблон на GitHub QmlAppTemplate.