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ónCMake
, por lo que la inclusión de bibliotecas "pesadas" comoOpenCV
tan fácil comoFIND_PACKAGE(OpenCV REQUIRED)
.Incluso tiene soporte
Qt
paraQt
paraQt
. De hecho, lo uso para un proyecto de software más grande dondeQt
se usa para la parte de GUI. Nos decidimos porCMake
porque necesitábamos independencia de plataforma y múltiples bibliotecas que no podíamos agregar fácilmente a través deqmake
.
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).
En realidad, puede colocar archivos de objetos junto a los archivos de origen utilizando:
CONFIG += object_parallel_to_source
o
CONFIG += object_with_source
dependiendo de tu versión de qmake.
Fuente: https://wiki.qt.io/Undocumented_QMake#Config_features