QT Uygulamalarının Konuşlandırılması

Bugün kısa bir bilgilendirme yazısı ile karşınızdayım. Bildiğiniz üzere bir süredir, QT ile ilgili bir çok yazı sizlerle paylaştım ve QT uygulamaları geliştirdik. Uygulamalarımız geliştirdik ve artık bunları kullanarak hedef platformlar üzerinde konuşlandırmak istiyoruz, ne yapmalıyız?

Şimdi bu soru, ilk etapta bazılarınıza anlamlı gelmeyebilir. Oluşturduğunuz QT çalıştırılabilir dosyalarını, tıklayarak çalıştırıyor olabilirsiniz. Bunun sebebi, kullandığınız bilgisayarda QT geliştirme ortamının ve ilgili kütüphanelerinin, ortam değişkenlerinde tanımlı olmasından dolayı olabilir (“Hata Ayıklama” (debug) için oluşturduğunuz çalıştırılabilir dosyalarda da hata alabilirsiniz).
Peki QT kurulu olmayan hedef platformlar için uygulamamızı konuşlandırmak için hangi kütüphane ve dosyalara ihtiyacımız olacak?

Burada ben Windows işletim sistemi için izlemeniz gereken adımlardan bahsedeceğim, diğer platformlar için ise QT’nin kendi dokümanlarına başvurabilirsiniz. Bunların bir kısmını kaynaklar kısmında veriyor olacağım.

Bu kütüphaneleri hazırlamak için iki temel yöntem var. Öncelikle el ile yapılandan bahsedeceğim.

El İle Kütüphanelerin Hazırlanması

QT’yü tanıttığım yazımda da bahsettiğim üzere, QT, bir çok alt kütüphaneden oluşmakta ve bunlar ayrı ayrı kütüphaneler aracılığı ile kullanılmaktadır.
Bu sebeple, öncelikle, bu kütüphaneleri (Qt5Core.dll, Qt5Gui.dll, vb.) .exe nizin yanına kopyalamanız gerekmekte. Bunlar genelde,”<qt path>\<version>\bin” (ör. C:\qt\qt5.12.0\5.12.0\msvc2017\bin” dizini içerisinde bulunmakta oraya bakabilirsiniz.

Bunlara ek olarak, bir de platform bağımlı kütüphanenin kopyalanması gerekmektedir. Bunlar da, yine QT kurulum dizininde bulunan “<qt path>\platforms\” altındaki qwindows.dll kütüphanesini, “platforms” dizinine kopyalamanız gerekiyor.

Sonuç olarak genel olarak dizin yapınız ve içeriği aşağıdakine benzer olmalıdır.

  • <platforms>\qwindows.dll
  • Executable.exe
  • opengl32sw.dll
  • libGLESV2.dll
  • D3Dcompiler_47.dll
  • libEGL.dll
  • Qt5Core.dll
  • Qt5Gui.dll
  • Qt5Qml.dll
  • Qt5Quick.dll
  • Qt5Network.dll
  • Qt5Widgets.dll

Dependency Walker

Bütün bunların yanında, daha önceki yazılımlarımda bahsettim mi bilmiyorum ama Windows platformu için yazılım geliştiriyor iseniz, DependencyWalker aracı sizin en büyük yardımcınız. Ne yapar bu yazılım? Nedir bu yazılım? Hemen bir göz atalım hızlıca.

Image result for dependency walker

Dependency Walker aracı (depends.exe), herhangi bir çalıştırılabilir uygulaması veya .dll kütüphanelerinin bağımlı olduğu, kullandığı .dll’lerin hepsini öz yineli bir şekilde tarayan programdır. Bu programı ilgili çalıştırılabilir dosya veya kütüphane ile çalıştırdığınız zaman, bahsettiğimiz bağımlı kütüphane (DLL) ve dosyaları listelemesinin yanında:

  • Eksik .dll’leri kontrol eder,
  • Kullanılan dosya ve DLL’lerin geçerli olup/olmadığını kontrol eder,
  • Kütüphane ise kullanılan ve sunulan fonksiyonların listesi sunulur ve bunların uyumlu olup/olmadığı kontrol eder,
  • Döngüsel bağımlılık hataları kontrol edilir,
  • İşletim sistemi ya da sürümler için hazırlanmış kütüphane hatalarını kontrol eder ve bunları listeler,
  • Kısacası eğer DLL oluşturuyor ya da kullanıyor iseniz bu araç sizin en önemli dostunuz olacaktır. Eğer halen temin etmediyseniz, hemen aşağıdaki adresten, işletim sistemine uygun olanı indirebilirsiniz.
  Download Version 2.2.6000 for x86 (Windows 95 / 98 / Me / NT / 2000 / XP / 2003 / Vista / 7 / 8) [610k]
 Download Version 2.2.6000 for x64 [468k]
  Download Version 2.2.6000 for IA64 [605k]

Aşağıdaki videoda bu yaklaşıma benzer bir yol izlenmekte, bir göz atabilirsiniz
https://www.youtube.com/watch?v=DJR57fkf-q8

QT Windows Konuşlandırma Aracı (windeployqt.exe)

Şimdi gelelim diğer yönteme. İlk yöntem nelerin kullanıldığı görmek ve benzeri uygulamalarda da izlemek adına iyi olabilir ama uygulamanız büyüdükçe ve otomasyon yapma ihtiyacınız arttıkça bu işi otomatik olarak yapmak daha doğru olacaktır. Bu anlamda da QT, 5.2 sürümü ile birlikte “windeployqt” isimli komut satırından çağırabileceğiniz bir araç sunmakta. Bu araç “<version>\bin\windeployqt.exe” altında bulunmakta ve eğer herhangi bir komut satırından bunu çağırmak istiyorsanız, ilgili yolun ortam değişkenlerine (PATH) eklenmiş olduğundan emin olmalısınız (ya da QTDIR/bin/qtenv2.bat i çağırmanız gerekmekte). Bu araç, aynı zamanda QML uygulamalarınız için de gerekli konuşlandırma dosyalarını hazırlamakta.

Peki bu aracı nasıl kullanacağınız. Çok kolay, uygulamanızı oluşturduktan sonra ilgili çalıştırılabilir dosyayı bu araca vermeniz yeterli. Aşağıda örnek bir komut bulabilirsiniz:

Bu komut ile, aracın bulunduğu dizin ortam değişkeni olarak mevcut komut satırı dizinine eklenmekte, daha sonra gerekli dosyalara “OutDir” dizini içerisine hazırlanmakta (not: bu arada çalıştırılabilir dosya bu dizin içerisine kopyalanmıyor). Araç ile ilgili bazı komut ve parametreler de aşağıdaki gibi, bunların detayına kaynaklar kısmındaki adresten ulaşabilirsiniz:

  • Usage: windeployqt [options] [files]
    Qt Deploy Tool 5.12.2
  • The simplest way to use windeployqt is to add the bin directory of your Qt
    installation (e.g. <QT_DIR\bin>) to the PATH variable and then run:
    windeployqt <path-to-app-binary> If ICU, ANGLE, etc. are not in the bin directory, they need to be in the PATH variable. If your application uses Qt Quick, run:
  • windeployqt –qmldir <path-to-app-qml-files> <path-to-app-binary>
  • Options:
    -?, -h, –help Displays this help.
    -v, –version Displays version information.
    –dir <directory> Use directory instead of binary directory.
    –libdir <path> Copy libraries to path.
    –plugindir <path> Copy plugins to path.
    –debug Assume debug binaries.
    –release Assume release binaries.
    –pdb Deploy .pdb files (MSVC).
    –force Force updating files.
    –dry-run Simulation mode. Behave normally, but do not
    copy/update any files.
    –no-patchqt Do not patch the Qt5Core library.
    –no-plugins Skip plugin deployment.
    –no-libraries Skip library deployment.
    –qmldir <directory> Scan for QML-imports starting from directory.
    –qmlimport <directory> Add the given path to the QML module search locations.
    –no-quick-import Skip deployment of Qt Quick imports.
    –no-translations Skip deployment of translations.
    –no-system-d3d-compiler Skip deployment of the system D3D compiler.
    –compiler-runtime Deploy compiler runtime (Desktop only).
    –no-compiler-runtime Do not deploy compiler runtime (Desktop only).
    –webkit2 Deployment of WebKit2 (web process).
    –no-webkit2 Skip deployment of WebKit2.
    –json Print to stdout in JSON format.
    –angle Force deployment of ANGLE.
    –no-angle Disable deployment of ANGLE.
    –no-opengl-sw Do not deploy the software rasterizer library.
    –list <option> Print only the names of the files copied.
  • Available options:
    source: absolute path of the source files
    target: absolute path of the target files
    relative: paths of the target files, relative to the target directory
    mapping: outputs the source and the relative target, suitable for use within an

Bu araç ile ilgili daha detaylı bilgi için aşağıdaki adrese de göz atabilirsiniz, ayrıca kaynaklar kısmına da bir çok kaynak ekliyorum.

Burada ayrıca bahsetmediğim ve yukarıdaki kütüphanelere de ihtiyaç duyulmayan statik bağlama yöntemi mevcut. Fakat bu, çalıştırılabilir dosyanın boyutunu büyütmekte ve ben de çok tercih etmediğim için burada bahsetmedim ama bunun ile ilgili de bilgi edinmek isterseniz aşağıdaki bağlantılara göz atabilirsiniz.

Kaynaklar

  • https://wiki.qt.io/Build_Standalone_Qt_Application_for_Windows
  • https://doc.qt.io/QtForDeviceCreation-5.12/qtee-static-linking.html
  • https://doc.qt.io/QtForDeviceCreation-5.12/qtee-static-linking.html
  • https://doc-snapshots.qt.io/qt5-5.12/windows-deployment.html
  • https://wiki.qt.io/Deploying_a_Qt5_Application_Linux
  • https://www.thewindowsclub.com/dependency-walker-download
  • https://www.youtube.com/watch?v=8qozxqSZQEg
  • https://stackoverflow.com/questions/10823455/finished-coding-desktop-app-in-qt-how-to-deploy-and-distribute-it
  • https://hub.packtpub.com/3-ways-to-deploy-a-qt-and-opencv-application/

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.