Yanıtlar:
Marka (veya daha doğrusu Makefile) bir yapı sistemidir - kodunuzu oluşturmak için derleyiciyi ve diğer oluşturma araçlarını çalıştırır.
CMake bir yapı sistemleri üretecidir. Makefiles üretebilir, Ninja derleme dosyaları üretebilir, KDEvelop veya Xcode projeleri üretebilir, Visual Studio çözümleri üretebilir. Aynı başlangıç noktasından aynı CMakeLists.txt dosyası. Platformdan bağımsız bir projeniz varsa, CMake onu sistemden bağımsız hale getirmenin bir yoludur.
GNU Make tarafından yemin eden Visual Studio ve Unix geliştiricilerine alışkın olduğunuz Windows geliştiricileriniz varsa, CMake gidilecek yollardan biridir.
Projenizi çok platformlu veya yaygın olarak kullanılabilir kılmak istiyorsanız, CMake'i (veya başka bir yapı sistemi oluşturucusunu kullanmanızı öneririm, ancak CMake benim kişisel tercihimdir). CMake ayrıca bağımlılık algılama, kütüphane arayüz yönetimi veya CTest, CDash ve CPack ile entegrasyon gibi bazı güzel özellikler de sunar.
Bir yapı sistemi jeneratörü kullanmak, projenizi geleceğe daha dayanıklı hale getirir. Şimdi GNU-Make-you olsanız bile, daha sonra diğer platformlara (Windows veya gömülü bir şey olsun) genişlemeye karar verirseniz veya sadece bir IDE kullanmak isterseniz ne olur?
find_package()
) Veya test / paketleme desteği gibi başka işlevleri de vardır .
CMake'in "derleme oluşturucusu" olduğu ile ilgili açıklama yaygın bir yanlış anlamadır.
Teknik olarak yanlış değil; sadece NASIL çalıştığını açıklar, ama ne işe yaradığını açıklamaz.
Soru bağlamında, aynı şeyi yapıyorlar: bir grup C / C ++ dosyası alıp bir ikili dosyaya dönüştürün.
Peki, gerçek fark nedir?
CMake çok daha üst düzey. Daha az derleme kodu yazdığınız C ++ 'ı derlemek için tasarlanmıştır, ancak genel amaçlı derleme için de kullanılabilir. make
bazı yerleşik C / C ++ kuralları da vardır, ancak çoğunlukla işe yaramazlar.
CMake
iki adımlı yapı yapar: bir düşük seviyeli inşa komut dosyası oluşturur ninja
veya make
diğer birçok jeneratörler veya ve sonra çalıştırın. Normalde yığınlanan tüm kabuk komut dosyası parçaları Makefile
yalnızca oluşturma aşamasında yürütülür. Böylece, CMake
yapı daha hızlı büyüklük emirleri olabilir.
Dilbilgisi CMake
dış araçları için destek çok daha kolaydır yapmak en fazla .
Bir make
yapıyı inşa ettikten sonra nasıl yapıldığını unutur. Hangi kaynaklardan inşa edildi, hangi derleyici bayrakları? CMake
izler, size make
bırakır. Kütüphane kaynaklarından biri önceki sürümüne beri kaldırıldıysa Makefile
, make
onu yeniden olmayacaktır.
Modern CMake
(3. sürümünden başlayarak) "hedefler" arasındaki bağımlılıklar açısından çalışır. Hedef hala tek bir otput dosyasıdır (ne yazık ki), ancak geçişli (CMake terimleriyle "genel" / "arayüz") bağımlılıklara sahip olabilir. Bu geçişli bağımlılıklar bağımlı paketlere maruz kalabilir veya gizlenebilir. CMake
sizin için dizinleri de yönetecektir. İle make
, bir dosya dosya ve yönetme dizinleri düzeyinde takılıp kalırsınız.
make
Son iki boşluğu kapatmak için bayrak dosyalarını kullanırken bir şey kodlayabilirsiniz , ancak kendi başınıza olursunuz. make
bir Turing tam dili (hatta iki, bazen üç sayım Guile ) içerir ve hepsi korkunçtur.
Dürüst olmak gerekirse, bu nedir CMake
ve make
: onların dilleri oldukça korkunç - ortak noktası
ile başlamak.
Ama CMake
sen çok daha az kod satırı yazıyorsun.