Dostlar, şu Qt ile cross-platform uygulama yazmak ne kadar keyifli değil mi? Ta ki, geliştirme makinenizden çıkıp da kullanıcının bilgisayarında çalıştırmaya çalışana kadar. Qt5Core.dll bulunamadı, platform plugin eksik, icuuc.dll nerede? Kafayı yiyecektim resmen. Her seferinde windeployqt ile dosyaları toplamak, sonra da eksik bir şey çıkınca isyan etmek... Buna bir son vermeliydim.
Araştırmalarım beni tek bir .exe dosyasına götürdü: Static Build. Meğerse Qt'yi kaynaktan, static kütüphaneler olarak derleyince, tüm bağımlılıklar o tek dosyanın içine gömülüyormuş. Hemen kolları sıvadım. Qt'nin açık kaynak kodlarını indirdim, configure script'ini çalıştırdım.
Bash:
configure -static -static-runtime -prefix C:\Qt\Static -opensource -confirm-license -nomake examples -nomake tests
İşte ilk engel! "Static linking requires a commercial license" diye bir hata aldım. Şaka gibi ama, açık kaynak (LGPL) lisansı ile static link yapmak için, uygulamanızı da dinamik link edilebilir şekilde (DLL ile) dağıtma veya kendi kodunuzu açma seçenekleriniz var. Ben opensource proje geliştirdiğim için sorun olmadı. Ticari bir projede dikkat etmek gerekiyor.
Configure başarılı olduktan sonra, sıra geldi asıl işe:
Bash:
nmake
Ve bekleyin... Saatlerce. Makinenin fanları kıyameti koparıyor. Ama sonunda, C:\Qt\Static altında tertemiz, static kütüphanelerim hazırdı. Qt Creator'dan kit'imi bu static sürüme işaret edecek şekilde ayarladım. Proje ayarlarında (.pro dosyası) birkaç ek flag gerekti:
Bash:
CONFIG += static
QMAKE_LFLAGS += -static
Build düğmesine bastım ve işte o mucize: release klasöründe, 20 MB civarında, kocaman ama YALNIZ BİR .exe dosyası! Başka hiçbir DLL, hiçbir plugin dosyası yok. Aldım, Windows'u yeniden kurmuş temiz bir sanal makineye attım. Çalıştırdım... Ve çalıştı! Gözlerim doldu resmen. Artık dependency hell denilen cehennemden kurtulmuştum.
Tabii her gülün dikeni var. Dosya boyutu büyüyor çünkü tüm kullanmadığınız modüller bile (örn: QtWebEngine) static library'ye gömülebiliyor. Derleme süresi inanılmaz uzun. Ve en önemlisi, lisans konusunu atlamamak lazım.
Ama şu an hissettiğim huzur paha biçilemez. Kullanıcıya "şu framework'ü yükle" demek yok. Sadece "bu dosyayı çift tıkla" talimatı var. Siz de bu static build macerasına girdiniz mi? Yaşadığınız ilginç sorular oldu mu? Daha küçük executable'lar için püf noktalarınız var mı?