Po dość ab frustracja z qmake, znalazłem to, co według mnie jest odpowiedzią na twoje pytanie. Jeśli nie, to nauczyłem się, że użyję qmake, dopóki nie znajdę czegoś lepszego, ponieważ jest to wciąż trochę brzydkie. Założyłem projekt demo, to moja struktura katalogów (pliki mają rozszerzenia, foldery nie):
MyProj
MyProj.pro
myproj-core
myproj-core.pro
globals.h
MyProjCore.h
MyProjCore.cpp
myproj-app
myproj-app.pro
main.cpp
Zaczynamy MyProj.pro
jako subdirs
projektu, który jest kluczem do robienia tego, co można zapytać. Zasadniczo, zamiast polegać na innych projektach do określania debugowania/wydania i wszelkiego rodzaju innych śmieci, wystarczy ustawić go w jednym pliku qmake. Nie pozwala ci tworzyć tylko tego, czego potrzebujesz, ale jest to najlepsze rozwiązanie, jakie mogę wymyślić. Oto treść:
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
jest typowy obiekt udostępniony biblioteka:
QT -= gui
TARGET = myproj-core
TEMPLATE = lib
DEFINES += MYPROJCORE_LIBRARY
SOURCES += MyProjCore.cpp
HEADERS += MyProjCore.h \
globals.h
myproj-app.pro
jest aplikacja konsument, gdzie trochę odbudować, gdy potrzebne Sztuką jest:
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
Mam nadzieję, że rozwiąże to twój problem, ponieważ wiem, że rozwiązał mój problem!
EDIT: Zrobiłem plik specjalnie dla budowania zależności o mnie, to należy go przechowywać w folderze rodzeństwem każdego z moich projektów (dzieckiem MyProj w strukturze katalogu określonym powyżej) o nazwie 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}
}
Więc na dole wszystkich zużywających aplikacji, mogę dodać linie:
DEPENDENCY_LIBRARIES = myproj-core
include(../config/dependencies.pri)
ta zakłada, że kopiujesz biblioteki do pewnego współużytkowanej lokalizacji i/lub ruchomych th em w razie potrzeby, więc moja funkcja może nie działać dla ciebie, ale pomyślałem, że dodam ją do rozwiązania.
Witaj Travis, Czy możesz opublikować pliki źródłowe projektu? Jestem pewien, że kilka osób to doceni i użyje projektu jako szablonu dla ich aplikacji. – lucab0ni
Byłoby wspaniale mieć pliki źródłowe. :) – Marcello90
Możesz użyć 'QMAKE_EXTENSION_SHLIB' zamiast próbować ustawić' SONAME' ręcznie - jako bonus, będzie działać również na Mac OS X (który używa 'dylib' jako rozszerzenia). – ashkulz