2010-06-02 9 views
7

Para mantener mi proyecto Qt algo organizado (usando Qt Creator), tengo un archivo .pro y varios archivos .pri. Recientemente agregué una clase a uno de mis archivos .pri que tiene el mismo nombre de archivo que una clase que ya existía en un archivo .pri por separado.Qt MOC Filename Colisiones usando múltiples archivos .pri

La estructura de archivos y los archivos make generados por qmake parecen ignorar la colisión del nombre de archivo que sigue. Todos los archivos moc_ * generados se envían al mismo subdirectorio (ya sea de versión o de depuración, dependiendo) y uno termina sobrescribiendo el otro. Cuando trato de hacer el proyecto, recibo varias advertencias que se ven así:

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

Y el proyecto no puede vincular.

Aquí hay un ejemplo simple de lo que estoy hablando.

estructura de directorios:

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

Contenido de project.pro:

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

Contenido de subdir1.pri:

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

Contenido de subdir2.pri:

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

¿Hay alguna manera de decirle a qmake que genere un sistema que coloque los archivos moc_ * de archivos .pri separados en subdirectorios separados?

Respuesta

3

Lo mejor que puede hacer es asegurarse de que todos los archivos tengan un nombre único. Hay otras herramientas además de qmake que también se romperán cuando trates de hacer lo que estás haciendo; también puede hacer que sea confuso para usted (por ejemplo, comprender lo que hace #include "file.h" es más difícil).

+0

no necesariamente de acuerdo con el argumento de confusión en cuanto a mi incluyen declaraciones en general, sería de la forma: # include "subdir1/file.h" nontheless, usted parece ser correcta. Los nombres de archivo únicos parecen ser la única manera de hacerlo aquí. – Stephen

+0

Creo que los archivos moc y los archivos del objeto no colisionarán ahora si siguieron los míos ... Sin embargo, a diferencia de tu comentario :) Corrígeme si el mío está mal. – liaK

4

En subdir1.pri probar añadiendo

MOC_DIR = "subdir1/MOCFiles" 

También para subdir2.pri dar

MOC_DIR = "subdir2/MOCFiles" 

No se prueba. Solo échale un vistazo. Espero que funcione

Edición 1: Donde MOCFiles es su carpeta deseada para que entren sus archivos moc.

Editar 2: Acabo de dejar de mencionar con el directorio de archivos MOC ya que se ha preguntado específicamente en la pregunta. Pero, además, es posible que también deba agregar lo siguiente a cada uno de los archivos pri. (Asegúrese de que las carpetas son diferentes para diferentes archivos * .pri)

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

creo tener varios archivos pri pueden trabajar sin colisiones por tener los mismos nombres de archivo. Como ha aceptado una respuesta (que dice que no es posible), realice los cambios anteriores y pruébela. Hágale saber si no está funcionando.

+0

No tuve suerte. Los archivos moc no están chocando entre sí ahora, pero los archivos de objeto (.o) sí lo están. Ay. – Stephen

+0

Intenta dar OBJECTS_DIR = "subdir2/ObjFiles" – liaK

0

He intentado esto antes. La respuesta corta es nombrarlos de manera diferente de alguna manera.Otra respuesta sería tratar cada subdirectorio como una biblioteca separada, con su propio archivo .pro, y usar un tipo de subdirectorios para compilar todos los directorios de la biblioteca.

Si realmente desea investigar una respuesta completa, puede especificar la herramienta que se utilizará para moc. En esta situación, es posible que pueda modificar el nombre para que se use un nombre ligeramente diferente para los dos archivos diferentes. Sin embargo, también deberá asegurarse de que cada archivo con un nombre diferente se agregue a la lista de archivos para compilar y vincular, y el archivo moc con el nombre original no lo es (o su compilación fallará).

Cuestiones relacionadas