2012-02-26 11 views
22

Digamos que tengo una aplicación Qt donde tengo dos clases con el mismo nombre en dos espacios de nombres diferentes:¿Por qué qmake coloca todos los archivos de objetos (.o) en un directorio?

namespace namespace1 
{ 
    class SomeClass; 
} 

namespace namespace2 
{ 
    class SomeClass; 
} 

y tengo una estructura de directorios del proyecto de acuerdo con ella:

-->src/ 
    -->namespace1/ 
    -->someclass.cpp 
    -->namespace2/ 
    -->someclass.cpp 

Cuando compile la aplicación con qmake, coloca todos los archivos de objetos (.o) en un directorio, por lo que crea alguna clase archivo primero y luego la reescribe con la segunda alguna clase.o - que es una colisión de nombre por lo que es malo.

¿Por qué qmake no tienen en cuenta la estructura de directorios de los archivos de origen y por qué no crear algo así como namespace1_someclass.o y namespace2_someclass.o?

Sí, puedo poner mis clases a un directorio y las nombran namespace1_someclass.cpp y namespace2_someclass.cpp y no habrá ningún conflictos de nombres, pero esto hace que las menores molestias mientras se mira en los archivos de origen en el proyecto explorador en Qt Creator porque cuando hay muchos archivos fuente en el proyecto, es mucho menos legible que si hubiera la estructura de directorios que puedo expandir o colapsar.

Uno más extrema es tener la estructura de directorios de la siguiente manera:

-->src/ 
    -->namespace1/ 
    -->namespace1_someclass.cpp 
    -->namespace2/ 
    -->namespace2_someclass.cpp 

que resuelve conflictos con los nombres pero redundante duplica los nombres de espacio de nombres - y, por tanto, de nuevo menos legible.

¿Por qué qmake no tiene al menos una opción para colocar los archivos objeto en la estructura del directorio de acuerdo con los archivos fuente? ¿Los creadores de Qt no ven que esta es una característica importante?

Y una cosa más - que podría recomendarme a utilizar cmake herramienta en lugar de qmake pero veo el uso de cmake mucho mucho mucho más difícil que qmake y qmake hace su trabajo excelente para mí hasta ahora - excepto la ubicación de archivos de objeto.

+3

sólo puedo adivinar lo que los autores de qmake estaban pensando; mi suposición es que simplemente no anticiparon que alguien tuviera múltiples archivos .cpp con el mismo nombre en el mismo proyecto. FWIW están trabajando en un reemplazo para qmake llamado qbs ... quizás hace un mejor trabajo (no lo he probado yo mismo, así que no sé): http://labs.qt.nokia.com/2012/ 02/15/introduction-qbs/ –

Respuesta

2

En relación con sus temores de que CMake podría ser demasiado complicado: he estado trabajando en proyectos que utilizan ambos sistemas de compilación. Aunque estoy de acuerdo que qmake es probablemente más fácil para empezar, CMake definitivamente tiene sus méritos, también:

  • Se hace fuera de la fuente construye muy fácil. Simplemente ejecute cmake <Path to source> en su directorio de compilación. Esto es genial cuando sus orígenes están en un recurso compartido de NFS, por ejemplo, y desea que los archivos de objeto se coloquen en un sistema de archivos local.

  • Su soporte para encontrar bibliotecas adicionales es muy poderoso. Muchos de los archivos FindXXX.cmake ya se incluyen con su distribución CMake, por lo que la inclusión de bibliotecas "pesadas" como OpenCV es tan fácil como FIND_PACKAGE(OpenCV REQUIRED).

  • Incluso tiene soporte listo para usar para Qt. De hecho, lo uso para un proyecto de software más grande donde se usa Qt para la parte de la GUI. Decidimos CMake porque necesitábamos independencia de plataforma y varias bibliotecas que no podíamos agregar fácilmente a través del qmake.

Con todo, utilice el sistema de construcción que se sienten cómodos con (siempre y cuando su sistema de construcción no inhibe el desarrollo de software).

2

Dependiendo de lo que intente construir, puede usar la plantilla subdirs en qmake para hacerlo. Necesitará poner un archivo de proyecto en cada uno de sus directorios namespace, y aquí puede especificar diferentes directorios de salida para sus archivos objeto.

-->src/main.pro 
    -->namespace1/n1.pro 
    -->someclass.cpp 
    -->namespace2/n2.pro 
    -->someclass.cpp 

main.pro:

TEMPLATE = subdirs 
SUBDIRS = namespace1 namespace2 

n1.pro y n2.pro:

include("../common.pri") 
OBJECTS_DIR = $${PWD} 
TARGET = some_target 
TEMPLATE = some_qmake_template 

common.pri: configuraciones comunes a ambos proyectos.

12

En realidad se puede poner los archivos de objetos junto a los archivos de origen mediante el uso de:

CONFIG += object_parallel_to_source

o

CONFIG += object_with_source

según la versión de qmake.

Fuente: https://wiki.qt.io/Undocumented_QMake#Config_features

+0

No estoy seguro de por qué esto no tiene más votos ascendentes. 'CONFIG + = object_parallel_to_source' en' Qt5' funcionó perfectamente para mí. – Pankrates

+0

¿No debería estar activado de manera predeterminada? ¿Alguien puede pensar en un posible problema o una penalidad de rendimiento al usar esto cada vez? – Machta

Cuestiones relacionadas