2010-02-18 14 views
42

Mam projekt, który łączy się z wieloma bibliotekami współdzielonymi.Zależności projektu Qmake (biblioteki połączone)

Powiedzmy projekt A zależy na projekty B i C

Idealnie chcę nakładać następujące zależności w moim pliku projektu:

  1. Rebuild Projekt A jeśli albo B lub C został przebudowany od ostatnim razem projekt a został zbudowany
  2. użyj wyjścia dla odpowiedniej konfiguracji (czyli jeśli projekt budowania w trybie debugowania, a następnie użyj wersje debugowania bibliotekami dla projektu B i C)

Czy ktoś wie, w jaki sposób mogę jawnie wyrazić takie zależności w moim pliku projektu?

Odpowiedz

5
  1. Sprawdź to pytanie: Force relink when building in QT Creator
  2. Spróbuj dodać coś podobnego do tego kodu do pro pliku:

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

Potem trzeba będzie określić zależności dla każdej konfiguracji:

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 
} 
58

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.

+0

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

+0

Byłoby wspaniale mieć pliki źródłowe. :) – Marcello90

+1

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

7

Używam poniższego rozwiązania. Działa to bez użycia dodatkowego pliku .pro z szablonem 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 
+2

To jest świetne, jeśli twoja biblioteka nie jest projektem qmake. Dzięki! – Patrick

1

miałem ten problem, gdy refactoring mojego projektu, po tym jak przeniósł się w nowym DLL (pqXDot) wielokrotnego użytku klasy (od pqGraphviz).

Po dodaniu nowego DLL do mojego projektu i dodanie nowego odniesienia dla innych DLL DLL i aplikacji, które to potrzebne, miałem w głównym .pro:

TEMPLATE = subdirs 

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

i przebudowy spowodował błąd linkera, ponieważ pqGraphviz, przebudowywany DLL nie może znaleźć pqXDot, nowej biblioteki DLL.

Okazuje się, że to wystarczy, aby uporządkować listę podkatalogów, przesuwając wymaganą DLL przed zależną jednej:

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

Dla tych, którzy są zainteresowani do szablonu swojego projektu Qt/QML, publikuję jeden szablon na GitHub QmlAppTemplate.

Powiązane problemy