2012-11-01 9 views
7

Ich habe ein Projekt mit einigen Ordnern, die Quelldateien mit den gleichen Namen enthalten passieren.Qmake: Dateinamen Konflikte in verschiedenen Ordnern vermeiden, ohne Bibliotheken Einführung

Mein Quellbaum sieht wie folgt aus:

project.pro 

foo/ 
    conflict.h 
    conflict.cpp 

bar/ 
    conflict.h 
    conflict.cpp 

some.h 
other.h 
files.h 
main.cpp 

Per Voreinstellung qmake ein Makefile erzeugt, die einen Build Baum wie folgt produzieren:

conflict.o 
main.o 
target 

Wo conflict.o die Datei für resultierende Objekt ist beide foo/conflict.cpp und foo/conflict.h.

Ich kann nicht zu ändern ihre Namen, weil sie ein externes Tool und zwingt unterschiedliche Dateinamen erzeugt unter Verwendung würde bedeuten, deren Inhalt zu ändern, so ist dies keine Option.

ich nicht auch Qmake SUBDIRS Vorlage verwenden mag, weil dies, dass (1) jeder subdir gebaut separat als Bibliothek und somit sehr erschwert den gesamten Build-Prozess (in meinen Augen zumindest) bedeuten würde, und (2) Im Verzeichnis der obersten Ebene kann ich keine Quelldateien haben. Oder liege ich falsch?

Kann ich qmake nicht einfach sagen, die Objektdateien in separate Verzeichnisse innerhalb des Buildverzeichnisses zu schreiben? So wird mein Build-Baum wie folgt aussehen:

foo/ 
    conflict.o 

bar/ 
    conflict.o 

main.o 
target 

Oder gibt es andere Lösungen weder fordern die Quelldateien zu benennen, noch so etwas wie statische Bibliotheken kompliziert einzuführen? Ich kann einfach nicht glauben, dass Qt dieses (in meinen Augen einfache) Problem jahrelang nicht gelöst hat. (I schon hat dieses Problem vor 4 Jahren, konnte aber die Dateien in diesem Projekt umbenennen, während hier kann ich nicht.)

Wenn es wichtig ist: Ich benutze Qt 4.8 sowohl auf Ubuntu mit G ++ und Windows mit mingw32.

+0

Es ist nicht möglich. –

+0

@NikosC. Kann ich eine Profildatei für die Top-Level-Dateien haben, die mit den anderen Bibliotheken verknüpft werden + eine Top-Level-SUBDIRS-Profildatei, die das Unterverzeichnis '.' Dies würde erfordern, dass ich auch die .pro-Datei für dieses subdir überschreibt, etwas anderes als der Top-Level-.proDatei für die gesamte App zu sein. Ich hoffe du verstehst was ich meine. Ich möchte nur vermeiden, dass ich alle Top-Level-Dateien in ein physisches Unterverzeichnis verschieben muss. – leemes

+0

Sie sollten wahrscheinlich nur eine zusätzliche Projektdatei für 'foo' verwenden, und Sie behalten eine vorhandene für die oberste Ebene dir und' bar'. Eine weitere Möglichkeit besteht darin, den widersprüchlichen Dateinamen zu symbolisieren: "ln -s bar/conflict.cpp bar/conflict_bar.cpp" und dann den Symlink in der Projektdatei zu verwenden. –

Antwort

2

Sind Sie an qmake gebunden? Wenn nicht, könnte eine Alternative cmake sein. Ich überprüfte gerade Ihre usecase mit einem einfachen CMakeLists.txt wie

cmake_minimum_required (VERSION 2.6) 
project (conflict) 
add_executable(conflict foo/conflict.cpp bar/conflict.cpp main.cpp) 

, die auch eine Quelldatei im Verzeichnis der obersten Ebene (main.cpp) enthalten. Dies baut richtig die ausführbare Datei - die Objektdateien sind in Unterverzeichnissen erstellt wie

./CMakeFiles/conflict.dir/main.cpp.o 
./CMakeFiles/conflict.dir/bar/conflict.cpp.o 
./CMakeFiles/conflict.dir/foo/conflict.cpp.o 

cmake umfasst auch die Unterstützung für Qt4, um automatisch in den erforderlichen Include-Pfaden und Bibliotheken zu ziehen. Es könnte einige Anstrengungen erfordern, um von qmake zu cmake zu migrieren, aber angesichts der Anforderungen, die Sie haben, würde ich es versuchen.

+0

Das Problem ist, dass für die erzeugten Code-Dateien auch eine .pri-Datei erzeugt wird, die hilft, alle generierten Dateien an ein tatsächliches Projekt zu binden. Aber da der Code-Generator von mir geschrieben wurde, könnte ich ihn umschreiben, um cmake zu verwenden, aber das wäre noch komplizierter als die Verwendung von qmakes Unterverzeichnissen, denke ich. Aber das wäre eine gute Lösung für andere Benutzer, also passt deine Antwort gut :) – leemes

+0

Schade;) Dann ist es wahrscheinlich der einfachste Weg Subdirs zu benutzen, wahrscheinlich statische Bibliotheken aufzubauen und schließlich alle miteinander zu verbinden. –

+0

Ja. Aber ich möchte ein Root-Projekt haben, das kein Unterprojekt ist, aber immer noch vom Aufbau der Unterverzeichnisse abhängt ... Ich weiß nicht, wie ich das machen kann. – leemes