tamaño smart reemplazar puede objeto inteligente ingles incrustar incrustados imagenes imagen enlazados elementos editar directamente copiar convert como colocar cambiar c++ qt qmake

c++ - smart - ¿Por qué qmake pone todos los archivos de objetos(.o) en un directorio?



incrustar imagenes en photoshop (3)

Digamos que tengo una aplicación Qt donde tengo dos clases con el mismo nombre en dos espacios de nombres diferentes:

namespace namespace1 { class SomeClass; } namespace namespace2 { class SomeClass; }

y tengo una estructura de directorio de proyectos de acuerdo con ella:

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

Cuando compilo la aplicación con qmake, coloca todos los archivos de objetos (.o) en un directorio, por lo que primero crea un archivo de clase.o y luego lo reescribe con el segundo someclass.o , que es una colisión de nombres, por lo que es malo .

¿Por qué qmake no tiene en cuenta la estructura del directorio de los archivos fuente y por qué no crea algo como namespace1_someclass.o y namespace2_someclass.o ?

Sí, puedo poner mis clases en un directorio y nombrarlas namespace1_someclass.cpp y namespace2_someclass.cpp y no habrá colisiones de nombres, pero esto causa pocos inconvenientes al mirar los archivos fuente en el explorador de proyectos en Qt Creator porque cuando hay Muchos archivos fuente en el proyecto, es mucho menos legible que si existiera la estructura de directorios que puedo expandir o colapsar.

Un extremo más es tener la estructura de directorios así:

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

que resuelve la colisión del nombre pero duplica redundantemente los nombres del espacio de nombres, y por lo tanto, es 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: podrías recomendarme usar la herramienta cmake en lugar de qmake, pero veo que el uso de cmake es mucho más difícil que qmake y qmake hace su trabajo excelente para mí hasta ahora, excepto la ubicación de los archivos de objeto.


Dependiendo de lo que intente construir, puede usar la plantilla de subdirs en qmake para hacer esto. Necesitará poner un archivo de proyecto en cada uno de sus directorios de namespace de namespace , y aquí puede especificar diferentes directorios de salida para sus archivos de 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.


En cuanto a sus temores de que CMake sea ​​demasiado complicado: he estado trabajando en proyectos usando ambos sistemas de compilación. Aunque estoy de acuerdo en que es probable que qmake sea ​​más fácil, CMake definitivamente también tiene sus méritos:

  • Hace construcciones fuera de la fuente 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 vienen con su distribución CMake , por lo que la inclusión de bibliotecas "pesadas" como OpenCV tan fácil como FIND_PACKAGE(OpenCV REQUIRED) .

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

En general, use el sistema de compilación con el que se sienta cómodo (siempre que su sistema de compilación no impida el desarrollo de su software).