Nie proszę o to tylko dla siebie. Mam nadzieję, że to pytanie będzie punktem odniesienia dla wielu początkujących, którzy mnie lubią, i uznało to za całkowicie zakłopotane, co dokładnie dzieje się za kulisami, gdy dla tak małego CMakeLists.txt
pliku
cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)
i taki mały tutorial.cpp
int main() { return 0; }
jest tak wiele wygenerowanych plików
CMakeCache.txt cmake_install.cmake Makefile
CMakeLists.txt tutorial.cpp
i CMakeFiles
folder z wieloma plikami i folderami
CMakeCCompiler.cmake CMakeOutput.log Makefile.cmake
cmake.check_cache CMakeSystem.cmake progress.marks
CMakeCXXCompiler.cmake CMakeTmp TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin CompilerIdC Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin CompilerIdCXX
CMakeDirectoryInformation.cmake Makefile2
Brak zrozumienia, co dzieje się za kulisami (tj. Dlaczego tak może być generowane pliki i jaki był ich cel), był największą przeszkodą w nauce CMake.
Jeśli ktoś wie, czy mógłbyś to wyjaśnić dla dobra potomności? Jaki jest cel tych plików, a kiedy piszę cmake .
, co dokładnie konfiguruje i generuje cmake, zanim zbuduje projekt?
Odpowiedzi:
Sekret polega na tym, że nie musisz rozumieć, co robią wygenerowane pliki.
CMake wprowadza wiele złożoności do systemu kompilacji, z których większość opłaca się tylko wtedy, gdy używasz go do tworzenia złożonych projektów oprogramowania.
Dobrą wiadomością jest to, że CMake dobrze radzi sobie z utrzymywaniem wielu bałaganu z dala od Ciebie: używaj kompilacji spoza źródła i nie musisz nawet patrzeć na wygenerowane pliki. Jeśli nie zrobiłeś tego do tej pory (co, jak sądzę, ma miejsce, odkąd napisałeś
cmake .
), sprawdź je przed kontynuowaniem . Mieszanie katalogu kompilacji i katalogu źródłowego jest naprawdę bolesne w przypadku CMake i nie jest sposobem, w jaki system powinien być używany.W skrócie: zamiast
zawsze używaj
zamiast. Zwykle używam pustego podfolderu
build
w katalogu źródłowym jako katalogu kompilacji.Aby złagodzić twój ból, pozwól mi krótko omówić odpowiednie pliki generowane przez CMake:
ccmake
lubcmake-gui
. Może to być przydatne od czasu do czasu, ale zalecałbym korzystanie z wyżej wymienionych narzędzi do zmiany dowolnej wartości, jeśli to możliwe.CMakeFiles
podkatalogu.Generalnie nie powinieneś majstrować przy żadnym z plików generowanych przez CMake. Wszystkie problemy można rozwiązać od wewnątrz
CMakeLists.txt
w taki lub inny sposób. Dopóki wynik buduje projekt zgodnie z oczekiwaniami, prawdopodobnie wszystko jest w porządku. Nie przejmuj się zbytnio krwawymi szczegółami - ponieważ właśnie tego CMake próbował cię oszczędzić.źródło
CMakeFiles
katalog zawieraCMakeError.log
i jestCMakeOutput.log
ważny dla rozwiązywania problemów z kompilacjami CMake.CMakeFiles/target_name.dir
katalogu, to plikiflags.make
ilink.txt
. Musiałem to sprawdzić w złożonym projekcie, który odziedziczył flagi / elementy z linkami z projektów zewnętrznych. Np .: Miałem pewne błędy, ponieważ TPL A było zależne od TPL B. Również mój projekt był zależny od B, które zainstalowałem lokalnie; ale A używał wersji B z mojego systemu (zamiast mojej lokalnej instalacji), która miała różne włączone opcje i pojawiła się pierwsza, powodując błędy w moim projekcie. Dopiero patrząc na link.txt mogłem stwierdzić, że to się dzieje.Jak podano na swojej stronie internetowej:
W większości przypadków służy do generowania plików projektu / tworzenia - w twoim przykładzie stworzył,
Makefile
które są używane do budowania twojego oprogramowania (głównie na platformie Linux / Unix).Cmake pozwala na dostarczanie plików kompilacji dla wielu platform, które generowałyby projekty / pliki dla konkretnej platformy dla określonej kompilacji / platformy.
Na przykład możesz spróbować skompilować swoje oprogramowanie w systemie Windows za pomocą programu Visual Studio, a następnie z odpowiednią składnią w
CMakeLists.txt
pliku, który możesz uruchomićwewnątrz katalogu twojego projektu na platformie Windows, Cmake wygeneruje wszystkie niezbędne pliki projektu / rozwiązania (
.sln
itp.).Jeśli chcesz zbudować swoje oprogramowanie na platformie Linux / Unix, po prostu przejdź do katalogu źródłowego, w którym masz
CMakeLists.txt
plik i uruchom to samo,cmake .
a wygeneruje wszystkie pliki niezbędne do zbudowania oprogramowania za pomocą prostegomake
lubmake all
.Tutaj masz bardzo dobrą prezentację na temat kluczowych funkcji Cmake http://www.elpauer.org/stuff/learning_cmake.pdf
EDYTOWAĆ
Jeśli chcesz utworzyć biblioteki zależne od platformy, definicje zmiennych itp., Możesz użyć tej składni w
CMakeLists.txt
plikuIstnieje również wiele poleceń z wykorzystaniem którego są w stanie zapobiec gromadzeniu z braku w miejscu CUpewnij powiadomi Cię, że na przykład nie masz biblioteki Boost
filesystem
iregex
zainstalowane w systemie. Aby to zrobić, możesz użyć następującej składni:Po sprawdzeniu, że wygeneruje pliki makefile dla odpowiedniego systemu / IDE / kompilatora.
źródło
Jak dokładnie działa CMake, to pytanie do programistów, więc na to pytanie nie ma tutaj odpowiedzi.
Możemy jednak udzielić przydatnych wskazówek dotyczących tego, kiedy należy używać CMake i kiedy należy się martwić, jak to działa. Nie jestem też fanem odpowiedzi „o, to po prostu działa” - ponieważ, zwłaszcza w oprogramowaniu, NIC nigdy nie „po prostu działa” i ZAWSZE musisz w pewnym momencie zagłębić się w szczegóły.
CMake jest narzędziem przemysłowym. Automatyzuje kilka BARDZO skomplikowanych procesów i bierze pod uwagę wiele zmiennych, których możesz nie być świadomy, zwłaszcza jako całkiem nowy programista, prawdopodobnie pracujący z ograniczoną wiedzą na temat wszystkich systemów operacyjnych i narzędzi do budowania, z którymi może sobie radzić CMake. Powodem, dla którego generowanych jest tak wiele plików i dlaczego rzeczy wydają się tak złożone, jest to, że wszystkie te inne systemy są złożone i muszą być rozliczane i zautomatyzowane. Ponadto istnieją problemy związane z "buforowaniem" i innymi funkcjami narzędzia oszczędzającymi czas. Zrozumienie wszystkiego w CMake oznaczałoby zrozumienie wszystkiego w tych narzędziach do budowania i systemach operacyjnych oraz wszystkich możliwych kombinacji tych zmiennych, co, jak możesz sobie wyobrazić, jest niemożliwe.
Ważne jest, aby pamiętać, że jeśli nie jesteś odpowiedzialny za zarządzanie dużym, wieloplatformowym systemem kompilacji, a Twoja baza kodu to kilka KLOC, może nawet do 100 KLOG, użycie CMake wydaje się trochę jak użycie usuwania drzew leśnych za 100 000 dolarów maszyna do usuwania chwastów z ogrodu kwiatowego o wymiarach 2 stopy na 2 stopy. (Nawiasem mówiąc, jeśli nigdy nie widziałeś takiej maszyny, powinieneś poszukać takiej na youtube, są niesamowite)
Jeśli Twój system kompilacji jest mały i prosty, prawdopodobnie lepiej będzie po prostu ręcznie napisać własne pliki makefile lub samodzielnie je skrypty. Gdy twoje pliki makefile stają się nieporęczne lub musisz zbudować wersję swojego systemu na innej platformie, możesz przełączyć się na CMake. W tym momencie będziesz miał wiele problemów do rozwiązania i możesz zadawać bardziej szczegółowe pytania na ten temat. W międzyczasie zapoznaj się ze wspaniałymi książkami o CMake, a nawet lepiej, napisz własną! 8)
źródło