2010-06-02 11 views
7

Afin de garder mon projet Qt organisé (en utilisant Qt Creator), j'ai un fichier .pro et plusieurs fichiers .pri. Tout récemment, j'ai ajouté une classe à un de mes fichiers .pri qui a le même nom de fichier qu'une classe qui existait déjà dans un fichier .pri séparé.Qt MOC Filename Collisions utilisant plusieurs fichiers .pri

La structure du fichier et les fichiers makefile générés par qmake semblent être inconscients de la collision de nom de fichier qui s'ensuit. Les fichiers moc_ * générés sont tous lancés dans le même sous-répertoire (soit release ou debug, selon) et l'un finit par écraser l'autre. Lorsque je tente de rendre le projet, je reçois plusieurs avertissements qui ressemblent à ceci:

Makefile.Release:318: warning: overriding commands for target `release/moc_file.cpp` 

Et le projet ne lien.

Voici un exemple simple de ce dont je parle.

Structure du répertoire:

 
+ project_dir 
| + subdir1 
| | - file.h 
| | - file.cpp 
| + subdir2 
| | - file.h 
| | - file.cpp 
| - main.cpp 
| - project.pro 
| - subdir1.pri 
| - subdir2.pri 

Contenu de project.pro:

TARGET = project 
TEMPLATE = app 
include(subdir1.pri) 
include(subdir2.pri) 
SOURCES += main.cpp 

Contenu du subdir1.pri:

HEADERS += subdir1/file.h 
SOURCES += subdir1/file.cpp 

Contenu du subdir2.pri:

HEADERS += subdir2/file.h 
SOURCES += subdir2/file.cpp 

Existe-t-il un moyen de dire à qmake de générer un système qui place les fichiers moc_ * des fichiers .pri séparés dans des sous-répertoires séparés?

Répondre

3

La meilleure chose à faire est de s'assurer que tous les fichiers ont un nom unique. Il y a d'autres outils en plus de qmake qui vont aussi casser quand vous essayez de faire ce que vous faites; vous pouvez également rendre cela confus pour vous-même (par exemple comprendre ce que fait #include "file.h" est plus difficile).

+0

Je ne suis pas nécessairement avec l'argument de la confusion que mes déclarations comprennent seraient généralement de la forme: #include « subdir1/fichier.h » Nontheless, vous semblez être correct. Les noms de fichiers uniques semblent être la seule façon d'y aller. – Stephen

+0

Je crois que les fichiers moc et les fichiers objets ne vont pas entrer en collision maintenant si vous avez suivi le mien .. Par opposition à votre commentaire si :) Corrigez-moi si le mien est faux .. – liaK

4

Dans subdir1.pri essayer annexant

MOC_DIR = "subdir1/MOCFiles" 

également pour subdir2.pri donner

MOC_DIR = "subdir2/MOCFiles" 

Il n'a pas été testé. Jetez un coup d'œil. J'espère que ça va marcher.

Édition 1: Où MOCFiles est votre dossier désiré pour vos fichiers moc à entrer.

Édition 2: Je viens de cesser de mentionner avec le répertoire de fichiers MOC puisque cela a été demandé spécifiquement dans la question. Mais en plus, vous devrez également ajouter ce qui suit à chacun des fichiers pri. (Assurez-vous que les dossiers sont différents pour les différents fichiers * .pri)

RCC_DIR = "subdir1/RCCFiles" 
UI_DIR = "subdir1/UICFiles" 
OBJECTS_DIR = "subdir1/ObjFiles" 

Je crois avoir plusieurs fichiers pri peuvent fonctionner sans collisions en ayant les mêmes noms de fichiers. Puisque vous avez accepté une réponse (qui indique que ce n'est pas possible), faites les changements ci-dessus et essayez. Faites savoir si cela ne fonctionne pas.

+0

Pas de chance. Les fichiers moc ne sont pas en collision entre eux maintenant, mais les fichiers objet (.o) sont. Hélas. – Stephen

+0

Essayez de donner OBJECTS_DIR = "subdir2/ObjFiles" – liaK

0

J'ai déjà essayé cela. La réponse courte est de les nommer différemment.Une autre réponse consisterait à traiter chaque sous-répertoire comme une bibliothèque distincte, avec son propre fichier .pro, et à utiliser un type de sous-répertoires pour compiler tous les répertoires de bibliothèque.

Si vous souhaitez vraiment rechercher une réponse complète, vous pouvez spécifier l'outil à utiliser pour moc. Dans cette situation, vous pourriez être capable de modifier le nom afin qu'un nom légèrement différent soit utilisé pour les deux fichiers différents. Cependant, vous devrez également vous assurer que chaque fichier nommé différemment est ajouté à la liste des fichiers à compiler et à lier, et que le fichier moc nommé à l'origine ne l'est pas (ou que votre build échouera).