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

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

Позволяет говорят, что проект A зависит от проектов B и C

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

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

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

44
задан Stick it to THE MAN 18 February 2010 в 11:45
поделиться

2 ответа

  1. Проверьте этот вопрос: Принудительное повторное связывание при сборке в QT Creator
  2. Попробуйте добавить что-то похожее на этот код в свой профессиональный файл:

     CONFIG (debug, debug | release) {
    DESTDIR = ../../../bin/debug 
    OBJECTS_DIR = ./debug 
    } 
    else {{{1 }} 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 
}
5
ответ дан 26 November 2019 в 22:08
поделиться

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

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

59
ответ дан 26 November 2019 в 22:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: