2010-01-18 11 views
5

Soy un desarrollador de C++ que está aprendiendo a escribir un juego inicialmente en la plataforma Mac usando XCode, pero ahora moviéndome a plataforma cruzada aprovechando CMake. Hasta ahora puedo compilarlo en mi netbook ickle linux y estoy armando un entorno de desarrollo en esta máquina para la codificación en marcha. Sin embargo, estoy descubriendo que gcc recompila cada archivo cada vez que realizo un cambio. Claramente necesito alguna configuración adicional para CMakeLists.txt. Mi actual es muy simple. Al igual que;cmake & gcc compila cada archivo cada vez

cmake_minimum_required (VERSION 2.8) 
set (source 
Creature.cpp 
DisplayManager.cpp 
Engine.cpp 
EngineState.cpp 
Entity.cpp 
GameWorld.cpp 
GfxSFML.cpp 
Item.cpp 
Map.cpp 
Position.cpp 
Projectile.cpp 
ScreenTile.cpp 
SquadAI.cpp 
Terrain.cpp 
UIButton.cpp 
UICharPanel.cpp 
UIView.cpp 
Utility.cpp 
Weapon.cpp 
fov.cpp 
main.cpp 
) 

find_package (OpenAL) 
find_package (OpenGL) 
find_package (SFML) 

set(CMAKE_CXX_FLAGS "-g -Wall -pg") 
add_executable (tractionedge ${source}) 
target_link_libraries(tractionedge ${SFML_LIBRARY} ${OPENGL_LIBRARY} ${OPENAL_LIBRARY}) 

Me he concentrado hasta ahora en C++ como un lenguaje en lugar de sistemas de construcción al seguir con XCode para todo. Mi conocimiento de Autotools (¿hacer?) Y Gcc es muy limitado. ¿Cómo hago para que gcc solo recompile la fuente modificada?

Respuesta

3

La reconstrucción de las fuentes modificadas DEBERÍA ser el comportamiento predeterminado. Por supuesto, si cambia un encabezado central incluido por casi todos los archivos cpp dependientes, desencadenará una reconstrucción casi completa. Mira lo que sucede si solo modificas un archivo cpp (agregando un comentario o similar), si se está compilando más de esa compilación, te propongo que dediques más tiempo a investigarlo y, finalmente, te proporcionare mi EMail para tener una visión más profunda de la configuración .

Otra posibilidad es que esté compilando bajo Windows y utilizando un 2.8 cmake que tiene un error al respecto. Mira una versión 2.9 para ver si ese defecto está ausente entonces: http://www.mail-archive.com/[email protected]/msg24876.html

0

Yo volvería a escribir tu CMakeLists.txt usando glob (tal vez mover los archivos en un directorio "src" si tienes otros archivos * .cpp) y dar a su proyecto un nombre (esto establece algunas variables importantes):

cmake_minimum_required (VERSION 2.8) 
project(TRACTION) 
file (GLOB TRACTION_SOURCES *.cpp) 
find_package (OpenAL) 
find_package (OpenGL) 
find_package (SFML) 

set(CMAKE_CXX_FLAGS "-g -Wall -pg") 
add_executable (tractionedge ${TRACTION_SOURCES}) 
target_link_libraries(tractionedge ${SFML_LIBRARY} ${OPENGL_LIBRARY} ${OPENAL_LIBRARY}) 
+2

No debe usar 'GLOB()' ya que si agrega un nuevo archivo '.cpp', CMake no lo sabrá y no se volverá a ejecutar automáticamente. En este caso, tendría que ejecutar cmake manualmente nuevamente, forzando una reconstrucción completa de todo. – Milliams

+5

No estoy de acuerdo. Mire algunos grandes proyectos con toneladas de archivos src (opencv), usan GLOB en todas partes, y sí, vuelven a ejecutar cmake cuando se agregan nuevos archivos (pero eso es algo que tiene que hacer de todos modos): "cmake" es menos pesado que edite el CMakeLists y ... ¡ejecute cmake para actualizar los makefiles! – gaspard

+1

Milliams, estás equivocado, acabo de probar ejecutar "cmake" después de una compilación completa (y grande): eso no marca todos los archivos como sucios. – gaspard

6

¿Está volviendo a ejecutar cmake cada vez? Si solo modifica un archivo fuente, debería poder simplemente volver a ejecutar make, y debería reconstruir solo el archivo de un objeto antes de vincularlo. Si vuelve a ejecutar cmake, podría marcar todos los archivos fuente sucios y reconstruir todo.

Solo vuelva a ejecutar cmake si cambia la lista real de los archivos fuente que se están utilizando, u otros cambios importantes como ese.

+0

De hecho, aún podría ejecutar 'make' ya que eso verificará si se han actualizado las dependencias. – Milliams

-2

Una solución simple en muchos de estos casos es eliminar por completo el árbol de construcción y regenerarla (y quiero decir algo en la línea de rm -rf build && mkdir build && cd build && cmake -G "Unix Makefiles" ../src, no sólo make clean)

Cuestiones relacionadas