Зависимости проекта Qmake (связанные библиотеки) - PullRequest
44 голосов
/ 18 февраля 2010

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

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

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

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

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

Ответы [ 5 ]

59 голосов
/ 14 марта 2010

После недолгого разочарования в 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 проект, который является ключом к выполнению того, что вы просите. По сути, вместо того, чтобы указывать отладку / выпуск и другие виды прочего мусора, в зависимости от других проектов, вы просто устанавливаете его на один файл 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)

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

8 голосов
/ 30 июня 2011

Я использую решение ниже. Это работает без использования дополнительного файла .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
5 голосов
/ 18 февраля 2010
  1. Проверьте этот вопрос: Принудительное пересвязывание при сборке в QT Creator
  2. Попробуйте добавить что-то похожее на этот код в свой файл:

    CONFIG(debug, debug|release) {   
        DESTDIR = ../../../bin/debug  
        OBJECTS_DIR = ./debug  
    }  
    else {   
        DESTDIR = ../../../bin/release  
        OBJECTS_DIR = ./release  
    }
    

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

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 
}
1 голос
/ 19 марта 2014

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

1 голос
/ 06 октября 2013

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

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

TEMPLATE = subdirs

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

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

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

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