Kafayı yiyecektim arkadaş. Proje büyüdükçe, her küçük değişiklik sonrası CMake'i çalıştırdığımda kahvemi alıp dolaşmaya çıkacak vaktim oluyordu. Meğerse başımıza bela edindiğimiz o şık, kullanışlı header-only kütüphaneler (seni çok seviyorum ama spdlog ve catch2) her yere #include edildikçe, her .cpp dosyası onları baştan sona tekrar tekrar okuyor ve işliyordu. Saniyeler dakika oldu, dakikalar... Neyse.
Visual Studio'nun derleme çıktısını analiz eden bir alet buldum. Gördüğüm manzara içler acısıydı. Ana core.h dosyam, ihtiyacı olmayan tonla şeyi içeriyor, bu da onu include eden 50+ dosyaya yayılıyordu. Precompiled header (stdafx.h) bile bu kadar kalabalık bir include grafiği karşısında yetersiz kalıyordu. StackOverflow'da bile "sadece forward declaration yap" dışında sihirli bir çözüm yoktu.
İşte o korkunç döngünün basit bir simülasyonu:
C++:
// utils.h (HEADER-ONLY BİR KÜTÜPHANE MİS GİBİ)
#include <vector>
#include <string>
#include <algorithm>
#include <memory>
// ... daha 10 tane STL header
// ... ve 3 tane projeye özel diğer header
class Util {
// ...
};
Haftalar süren bir refactoring başlattım. Kural basitti:
1. Bir header, SADECE ihtiyacı olan şeyleri include edecek. Mümkünse pointer/ref kullanılan sınıflar için sadece forward declaration.
2. Header-only'ler mümkünse sadece onlara gerçekten ihtiyaç duyan .cpp dosyalarına include edilecek.
3. Büyük, template ağırlıklı header'lar için ayrı bir detail/ klasörü oluşturulup, include grafiğinden izole edilecek.
Sonuç? Dostlar, ilk temizlikten sonra full rebuild süresi neredeyse %40 azaldı. Artık terminaldeki o ilerleme çubuğunu donmuş gibi izlemiyorum. Kod tabanı da daha modüler, daha anlaşılır oldu.
Siz de benzer bir derleme zamanı kabusu yaşıyor musunuz? Özellikle büyük C++ projelerinde include grafiğini yönetmek için başka hangi hileleriniz var? Unity Build denen şey gerçekten işe yarıyor mu?