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