Seite 1 von 1

qmake und Konfiguration über die pro - Datei

Verfasst: 12. Juni 2010 11:19
von Pixtar
Hallo Leute,

da die eigene Dokumentation v.4.6 mir keinerlei schlüssige Informationen über die Verwendung der Kompilierungsoptionen gibt, wollte ich Euch mal fragen.

Es geht um den Aufbau eines Projektes, was hinterher eine geordnete Ordnerstruktur aufweist.

Die Referenz besagt:
DLLDESTDIR
Specifies where to copy the target dll.

DESTDIR
Specifies where to put the target file.

TARGET
This specifies the name of the target file.
Bei DLLDESTDIR fehlen mir beispielsweise Informationen darüber, woher er die DLLs beim kompilieren überhaupt nimmt. Weiter, ob die Angabe des Pfades absolut sein muss oder ob das anhand der verwendeten Syntax entschieden wird:

Code: Alles auswählen

DLLDESTDIR = "d:\projekt\dll\" #absolut
DLLDESTDIR = projekt/ #relativ aber zu welchem Ordner? ?DESTDIR?
Weiterhin steht nirgendwo ob nach der Variable ein Gleichheitszeichen oder ein Pluszeichen mit einem Gleichheitszeichen stehen muss.
Aber wahrscheinlich ist das egal was man da verwendet als Wertzuweisung?! Pluszeichen mit einem Gleichheitszeichen sagt dem Compiler wahrscheinlich nur, das er die Werte an die Variable anhängen soll.

Mich würde ebenfalls interessieren ob es eine Anweisung gibt, die Besagt:
1. Schaue welche #includes das Projekt besitzt
2. Schaue ob es eine Verlinkung zu der dazu passenden DLL gibt
3. Kopiere die gefundenen DLLs in das Build-Verzeichnis
Denn wenn ich das Projekt weitergeben will und erweitere es um eine neue Komponente (QThread oder so) muss ich meist eine neue DLL aus dem QT-Ordner popeln und dem Projekt beilegen. Wäre schön wenn qmake das mal selbst übernehmen könnte. ;)

Ebenfalls wäre interessant zu wissen wie ich absolute Pfade angeben muss?
Es geht mir speziell um das Querstrichzeichen:
"C:\test\"
"C:\\test\\"
"C:/test/"
"C://test//"
Welche Angabe ist hier für die Syntax des Compilers gefordert und muss die Pfadangabe durch ein Slash terminiert werden? Gilt die Syntax ebenfalls für relative Pfadangaben?

Achja und bevor ich es vergesse, wie sieht es mit der Groß- und Kleinschreibung bei den Pfaden aus, muss die korrekt sein oder ist dem Compiler das egal? In wie weit wird die Pfadangabe bei der Angabe von:

Code: Alles auswählen

$$quote("d:\TesT\pro Jek T\")
beeinflusst?

So Schluss jetzt :D Ich denke das war es vorerst an Fragen zur Compilerkonfiguration über das *.pro-File.

Ich wäre keinem Böse wenn er nur eine meiner Fragen beantwortet - bin für jegliche Hilfe dankbar. :)

Grüße,
Pixtar

Verfasst: 12. Juni 2010 12:12
von solarix
Bei DLLDESTDIR fehlen mir beispielsweise Informationen darüber, woher er die DLLs beim kompilieren überhaupt nimmt.
"Destination" ist ein "Ziel" nicht eine "Quelle".. Wenn du ein Qt-Projekt hast, welches eine dynamische Library (so/dll) erstellt, kannst du damit steuern, WOHIN er die neu generierte Library hinkopieren soll..

Ich glaube deine Frage bezieht sich nicht auf den Compiler, sondern auf den Linker (also woher der Linker eine (nicht-Qt)Library bezieht).
Siehe dazu das Beispiel "LIBS":
http://doc.qt.nokia.com/4.6/qmake-varia ... .html#libs
Weiter, ob die Angabe des Pfades absolut sein muss oder ob das anhand der verwendeten Syntax entschieden wird
Das ist qmake schnuppe und gibt einfach das was du konfigurierst als Argumente der aufgerufenen Programme (moc/compiler/linker). Relative Pfade sind etwas flexibler (Projekt kann verschoben werden und unabhängig vom OS).
Denn wenn ich das Projekt weitergeben will und erweitere es um eine neue Komponente (QThread oder so) muss ich meist eine neue DLL aus dem QT-Ordner popeln und dem Projekt beilegen. Wäre schön wenn qmake das mal selbst übernehmen könnte.
Das geht über den Anwendungszweck von qmake hinaus. Falls ich sowas benötigen würde, würde ich unter Unix entweder ein Extra-Target ("make install" oder so) oder ein Script schreiben...
Ebenfalls wäre interessant zu wissen wie ich absolute Pfade angeben muss? Es geht mir speziell um das Querstrichzeichen:
Siehe die zahlreichen Beispiele in der Doku.. z.B.
http://doc.qt.nokia.com/4.6/qmake-varia ... .html#libs

Achja und bevor ich es vergesse, wie sieht es mit der Groß- und Kleinschreibung bei den Pfaden aus, muss die korrekt sein oder ist dem Compiler das egal? In wie weit wird die Pfadangabe bei der Angabe von:
Das ist qmake schnuppe und hängt vom OS ab.

hth..

[EDIT]
Weiterhin steht nirgendwo ob nach der Variable ein Gleichheitszeichen oder ein Pluszeichen mit einem Gleichheitszeichen stehen muss.
Das hängt von der qmake-Variabel ab. Mit "+=" hängst du der Variabel einfach weitere Angaben an. Mit "=" überschreibst du sie. Deshalb macht es z.B. sinn, "TARGET" einfach mit "=" zu überschreiben (das ist keine Liste), aber LIBS mit "+=" zu erweitern (damit evt. vorhandene Vorgaben nicht wieder gelöscht werden).

Verfasst: 12. Juni 2010 12:42
von Pixtar
Danke für deine Hile solarix!
solarix hat geschrieben:
Denn wenn ich das Projekt weitergeben will und erweitere es um eine neue Komponente (QThread oder so) muss ich meist eine neue DLL aus dem QT-Ordner popeln und dem Projekt beilegen. Wäre schön wenn qmake das mal selbst übernehmen könnte.
Das geht über den Anwendungszweck von qmake hinaus. Falls ich sowas benötigen würde, würde ich unter Unix entweder ein Extra-Target ("make install" oder so) oder ein Script schreiben...
Okay dann weiß ich schon einmal mit was ich mich als nächstes zu beschäftigen habe. ;)

Ich hätte da noch eine Frage zu der Dateiinformation: dem Exec-Datei>>Rechtsklick>>Eigenschaften>>Information

Wie/Wo kann ich diese Informationen beim Erstellen der exec-Datei übergeben/angeben?

NACHTRAG: Gibt es eine Variable die besagt an welchem Ort das Makefile erstellt werden soll?

Verfasst: 13. Juni 2010 01:01
von Pixtar
Ich habe gerade die Variable QMAKE_PRE_LINK entdeckt, welche laut Bibo Konsolenbefehle ausführt vor dem Linken.

Bislang sieht meine *.pro-Datei wie folgt aus:

Code: Alles auswählen

PRODIR = $$quote($$_PRO_FILE_PWD_)/
    BUILDDIR = $${PRODIR}build/
        TEMPDIR = $${BUILDDIR}temp/
            MOCDIR = $${TEMPDIR}moc/
            OBJDIR = $${TEMPDIR}obj/
            RCDIR = $${TEMPDIR}res/
        EXECDIR = $${BUILDDIR}exec/
            DLLDIR = $${EXECDIR}dlls
            DLLDIR = $$replace(DLLDIR, /, \)
    MATERIALDIR = $${PRODIR}materials/
    SRCDIR = $${PRODIR}src/
        SRCDLLDIR = $${SRCDIR}dlls/
        SRCDLLDIR = $$replace(SRCDLLDIR, /, \)

TARGET      = Magnetrum
TEMPLATE    = app
DEFINES     += QT_THREAD_SUPPORT
HEADERS     = $${SRCDIR}*.h
SOURCES     = $${SRCDIR}*.cpp
RESOURCES   = $${MATERIALDIR}material.qrc

DESTDIR     = $${EXECDIR}
OBJECTS_DIR = $${OBJDIR}
MOC_DIR     = $${MOCDIR}
RCC_DIR     = $${RCDIR}


win32: {
    RC_FILE         = $${MATERIALDIR}appinfo.rc
    QMAKE_POST_LINK += mkdir \"$${DLLDIR}\" && \
                       copy \"$${SRCDLLDIR}lib.dll\" \"$${DLLDIR}\" /Y && \
                       copy \"$${SRCDLLDIR}33.dll\" \"$${DLLDIR}\" /Y
}
unix:{
    QMAKE_POST_LINK += mkdir \"$${DLLDIR}\" && \
                       cp \"$${SRCDLLDIR}lib.dll\" \"$${DLLDIR}\" -f && \
                       cp \"$${SRCDLLDIR}33.dll\" \"$${DLLDIR}\" -f
}
Mein *.rc-File sieht wie folgt aus:

Code: Alles auswählen

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 0,10,0,0
 PRODUCTVERSION 0,10,0,0
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x29L
#else
 FILEFLAGS 0x28L
#endif
 FILEOS 0x4L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0"
        BEGIN
            VALUE "Comments", "ToDo: 1,23,22,11,56\0"
            VALUE "CompanyName", "Test Corp.\0"
            VALUE "FileDescription", "Multiplatform Client\0"
            VALUE "FileVersion", "0.30.0.0\0"
            VALUE "InternalName", "Gsi, version 0.30\0"
            VALUE "LegalCopyright", "Copyright S 2001-2005 by Austin Casnager\0"
            VALUE "LegalTrademarks", "\0"
            VALUE "OriginalFilename", "Gsi.exe\0"
            VALUE "PrivateBuild", "Gsi-0.30-Daisy, Copyright S 2004-2005 by Michal Knappe\0"
            VALUE "ProductName", "Gsi, version 0.30\0"
            VALUE "ProductVersion", "0.30.0.4\0"
            VALUE "SpecialBuild", "\0"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END
Derweil habe ich zwei Probleme die ich nicht gelöst bekomme:

1. Nach dem Kompilieren/Linken gibt der Creator die Meldung raus, dass er nicht weiß was er öffnen soll. Ich habe keine Ahnung wie ich ihm sage das er die gerade erstellte Datei ausführen soll, bzw. warum er das überhaupt fragt oder ob es dafür überhaupt eine Variable gibt? (Verhält sich als wenn man ein DLL Projekt ausführen wollte anstatt nur zu erstellen..)

2. Die MSDN sagt: Willst du Informationen über deine Exe-Datei einpflegen so schaffe dir ein *.rc-File und schreibe dort den Block rein den du brauchst - den Rest macht der Compiler. Nun der Beispielcode von der MSDN funktioniert leider nicht so ohne weiteres. Hat jemand eine Idee warum ich keine Eigenschaften der Exe-Datei angezeigt bekomme iin win32 (win7)?