2010-01-18 13 views
5

Jestem uczącym się programistą C++ piszącym grę początkowo na platformie Mac przy użyciu XCode, ale teraz przechodzę na platformę poprzez wykorzystanie CMake. Do tej pory mogę go skompilować na moim netbookie ickle linux i tworzę środowisko dev na tej maszynie do kodowania go-go. Jednak stwierdzam, że gcc rekompiluje każdy plik za każdym razem, gdy dokonuję zmiany. Najwyraźniej potrzebuję dodatkowej konfiguracji do CMakeLists.txt. Mój obecny jest bardzo prosty. Tak jak to;cmake & gcc kompiluje każdy plik za każdym razem

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}) 

Skoncentrowałem się na C++ raczej na języku, niż na kompilacji systemów, trzymanie się XCode za wszystko. Moja wiedza na temat Autotools (marka?) I Gcc jest bardzo ograniczona. W jaki sposób GCC rekompiluje tylko zmienione źródło?

Odpowiedz

3

Przebudowywanie tylko zmodyfikowanych źródeł POWINIEN być domyślnym zachowaniem. Oczywiście, jeśli zmienisz centralny nagłówek dołączony przez prawie wszystkie zależne pliki cpp, spowoduje to niemalże całkowitą przebudowę. Spójrz, co się stanie, jeśli zmodyfikujesz tylko jeden plik cpp (dodając komentarz lub podobne), jeśli kompiluje się więcej niż ta kompilacja, proponuję zainwestować więcej czasu w zbadanie tego, w końcu dając mojemu EMailowi ​​głębsze spojrzenie na konfigurację .

Inną możliwością jest kompilacja pod oknami i użycie 2,8 cmake z błędem. Spójrz na wersję 2.9, aby sprawdzić, czy ta wada jest niedostępna: http://www.mail-archive.com/[email protected]/msg24876.html

0

Napisałbym twój CMakeLists.txt używając glob (może przenieść pliki w katalogu "src", jeśli masz inne pliki * .cpp) i dać projekt nazwę (to ustawia kilka ważnych zmiennych):

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

Nie powinieneś używać funkcji 'GLOB()', ponieważ jeśli dodasz nowy plik '.cpp', CMake nie będzie o tym wiedział i nie będzie automatycznie ponownie uruchamiany. W takim przypadku będziesz musiał ręcznie uruchomić cmake, zmuszając do kompletnej przebudowy wszystkiego. – Milliams

+5

Nie zgadzam się. Spójrz na duże projekty z mnóstwem plików src (opencv), używają GLOB wszędzie i tak, ponownie uruchamiają cmake po dodaniu nowych plików (ale to jest coś, co i tak musisz zrobić): "cmake" jest mniejszym obciążeniem niż edytuj CMakeLists i ... uruchom cmake, aby zaktualizować pliki makefile !! – gaspard

+1

Milliamy, wszyscy się mylicie, właśnie testowałem "cmake" po kompletnej (i dużej) kompilacji: to nie oznacza, że ​​wszystkie pliki są brudne. – gaspard

6

Czy ponowne uruchomienie cmake za każdym razem? Jeśli zmodyfikujesz tylko jeden plik źródłowy, powinieneś być w stanie po prostu ponownie uruchomić make i powinien on odbudować tylko jeden plik obiektowy przed połączeniem. Jeśli ponownie uruchomisz cmake, może on oznaczyć wszystkie pliki źródłowe jako brudne i odbudować wszystko.

Ponownie uruchom ponownie cmake, jeśli zmienisz faktyczną listę używanych plików źródłowych lub inne ważne zmiany.

+0

W rzeczywistości nadal można po prostu uruchomić 'make', ponieważ sprawdzi, czy jakieś zależności zostały zaktualizowane. – Milliams

-2

Prostym rozwiązaniem w wielu z tych przypadków jest całkowicie wytrzeć drzewo budowania i zregenerować go (i mam na myśli coś w rodzaju rm -rf build && mkdir build && cd build && cmake -G "Unix Makefiles" ../src, nie tylko make clean)

Powiązane problemy