{"id":2053,"date":"2021-03-20T22:23:38","date_gmt":"2021-03-20T22:23:38","guid":{"rendered":"https:\/\/www.yazilimperver.com\/?p=2053"},"modified":"2021-11-03T21:32:26","modified_gmt":"2021-11-03T21:32:26","slug":"amt-4-qt-ayarlamalari","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/","title":{"rendered":"Uygulama \u0130zleme Yaz\u0131l\u0131m\u0131 4 &#8211; Qt Ayarlamalar\u0131"},"content":{"rendered":"<p>Evet dostlar, k\u0131sa bir ara verdikten sonra uygulama izleme yaz\u0131l\u0131m\u0131 yaz\u0131lar\u0131m\u0131za devam ediyoruz. Bu yaz\u0131m\u0131zda, CMake ile QT k\u00fct\u00fcphanelerimizi nas\u0131l konfig\u00fcre edebilirize bakaca\u011f\u0131z. Bunu da yaparken uygulama izleme yaz\u0131l\u0131m\u0131m\u0131z\u0131n par\u00e7alar\u0131n\u0131 olu\u015fturmaya devam edece\u011fiz. \u00d6nceki yaz\u0131lar\u0131m ile birlikte asl\u0131nda, uygulama i\u00e7in gerekli alt yap\u0131y\u0131 ve anlatmak istedi\u011fimi di\u011fer teknolojilere k\u0131sa da olsa de\u011finmi\u015f olduk. Bir s\u00fcre, uygulaman\u0131n kendisine yak\u0131ndan bakaca\u011f\u0131z, fakat bu yaz\u0131da a\u011f\u0131rl\u0131kl\u0131 olarak yeni ekledi\u011fimiz proje tipleri ve bunlara ili\u015fkin CMake ile ilgili yap\u0131lmas\u0131 gereken ayarlara de\u011finiyor olaca\u011f\u0131z.<\/p>\n<p>A\u00e7\u0131k\u00e7as\u0131, internette CMake&#8217;e, QT ve CMake kullan\u0131m\u0131na ili\u015fkin, bir \u00e7ok kaynak var ama genelde hep belirli bir noktaya de\u011finiyorlar ve derli toplu bir kaynak bulmak ger\u00e7ekten zor. Umut ediyorum ki, bu yaz\u0131 ve proje yap\u0131s\u0131 QT ve CMake kullan\u0131c\u0131lar\u0131 i\u00e7in g\u00fczel bir ba\u015fvuru ve ba\u015flang\u0131\u00e7 noktas\u0131 olacak.<\/p>\n<p>Yaz\u0131 dizisinin di\u011fer yaz\u0131lar\u0131na eri\u015fmek i\u00e7in a\u015fa\u011f\u0131daki ba\u011flant\u0131lar\u0131 kullanabilirsiniz:<\/p>\n<p><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2020\/12\/16\/uygulama-izleme-yazilimi\/\">Uygulama \u0130zleme Yaz\u0131l\u0131m\u0131<\/a><\/strong><\/span><\/p>\n<p><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/01\/03\/uygulama-izleme-yazilimi-2-baslangic\/\">Uygulama \u0130zleme Yaz\u0131l\u0131m\u0131 2 &#8211; Ba\u015flang\u0131\u00e7<\/a><\/strong><\/span><\/p>\n<p><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/01\/25\/uygulama-izleme-yazilimi-serisi-3-birim-test\/\">Uygulama \u0130zleme Yaz\u0131l\u0131m\u0131 3 &#8211; Utility, Birim Testler, S\u00fcrekli Entegrasyon<\/a><\/strong><\/span><\/p>\n<p><span style=\"color: #339966;\"><strong><a style=\"color: #339966;\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/\"><span style=\"color: #008000;\">Uygulama \u0130zleme Yaz\u0131l\u0131m\u0131 4 &#8211; Qt Ayarlamalar\u0131<\/span><\/a><\/strong><\/span><\/p>\n<p><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/11\/03\/uygulama-izleme-yazilimi-5-amt-v1-0\/\">Uygulama \u0130zleme Yaz\u0131l\u0131m\u0131 5 &#8211; AMT v1.0<\/a><\/strong><\/span><\/p>\n<p>Peki bu yaz\u0131da nelere bak\u0131yor olaca\u011f\u0131z. Hemen k\u0131saca bir \u00f6zetleyeyim:<\/p>\n<ul>\n<li>Daha \u00f6nce de bir ka\u00e7 yaz\u0131mda bahsetti\u011fim soket alt yap\u0131s\u0131n\u0131n elden ge\u00e7irilmesi ve\u00a0 statik k\u00fct\u00fcphane olarak eklenmesi,<\/li>\n<li>QT statik k\u00fct\u00fcphane (a\u011f kabiliyetleri), dinamik k\u00fct\u00fcphane (varsay\u0131lan protokol) ve uygulama \u00f6rnekleri (istemci test uygulamas\u0131),<\/li>\n<li>QT dinamik k\u00fct\u00fcphane olu\u015fturma ve kullan\u0131m\u0131,<\/li>\n<li>QML uygulama \u00f6rne\u011fi (uygulama izleme sunucu yaz\u0131l\u0131m\u0131),<\/li>\n<li>QT i\u00e7in kullan\u0131labilecek CMake ayarlar\u0131,<\/li>\n<li>QT i\u00e7in gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131n da CMake arac\u0131l\u0131\u011f\u0131 ile olu\u015fturulan dosyalar\u0131n yan\u0131na kopyalanmas\u0131.<\/li>\n<\/ul>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz \u00fczere, bir \u00e7ok konu var de\u011finece\u011fimiz, hemen ba\u015flayal\u0131m \ud83d\ude09<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Genel Yap\u0131 ve Projeler<\/strong><\/span><\/h2>\n<p>Bu yaz\u0131 sonunda, VS 2019 i\u00e7erisinde g\u00f6rece\u011finiz proje yap\u0131s\u0131 a\u015fa\u011f\u0131daki gibi olacakt\u0131r. Burada \u00e7al\u0131\u015ft\u0131r\u0131labilir uygulamalar\u0131m\u0131z &#8220;Apps&#8221; alt\u0131nda toplanacak, k\u00fct\u00fcphaneler &#8220;Libraries&#8221; alt\u0131nda toplan\u0131yor olacak ve \u00fc\u00e7\u00fcnc\u00fc parti k\u00fct\u00fcphaneler de &#8220;Ext&#8221; alt\u0131nda toplan\u0131yor olacak. Test projelerini de &#8220;Test&#8221; dizini alt\u0131nda toplayaca\u011f\u0131z.<\/p>\n<p id=\"JjvyoBj\"><img loading=\"lazy\" decoding=\"async\" width=\"379\" height=\"635\" class=\"size-full wp-image-2132 aligncenter\" src=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2021\/03\/img_60562182443dd.png\" alt=\"\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2021\/03\/img_60562182443dd.png 379w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2021\/03\/img_60562182443dd-179x300.png 179w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2021\/03\/img_60562182443dd-150x251.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2021\/03\/img_60562182443dd-200x335.png 200w\" sizes=\"auto, (max-width: 379px) 100vw, 379px\" \/><\/p>\n<p>Yeni ekledi\u011fim projelere ve kaynak kodlara ili\u015fkin olabildi\u011fince sizleri y\u00f6nlendirebilecek, yorumlar\u0131 ekledim. Kodlar\u0131 incelerken sizlere yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p>\u00d6ncelikle a\u011f kabliyetlerine ili\u015fkin projlere bakal\u0131m. Daha \u00f6nce bu kabiliyetlere, B\u00c7OM serisinde detayl\u0131 bir \u015fekilde de\u011finmi\u015ftim. Asl\u0131nda kabiliyet anlam\u0131nda yeni bir \u015fey yok. Sadece, orada tek bir k\u00fct\u00fcphane olarak sundu\u011fumuz soket k\u00fct\u00fcphanesini burada, rafine alt k\u00fct\u00fcphanelere ay\u0131yoruz nelerdir bunlar:<\/p>\n<ul>\n<li><strong>TCPClient:<\/strong>\n<ul>\n<li>TCP\/IP haberle\u015fme protokol\u00fc kullanarak, istemci kabiliyetlerini ger\u00e7ekle\u015ftirmek i\u00e7in ihtiya\u00e7 duyulan i\u015flevleri sunar,<\/li>\n<li>Gerekli ayarlar\u0131n yap\u0131lmas\u0131na olanak sa\u011flayan konfig\u00fcrasyon parametreleri sunulmaktad\u0131r,<\/li>\n<li>QT C++ statik k\u00fct\u00fcphane projesidir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>TCPServer:<\/strong>\n<ul>\n<li>TCP\/IP haberle\u015fme protokol\u00fc kullanarak, sunucu kabiliyetleri ger\u00e7ekle\u015ftirmek i\u00e7in ihtiya\u00e7 duyulan i\u015flevleri sunar,<\/li>\n<li>Gerekli ayarlar\u0131n yap\u0131lmas\u0131na olanak sa\u011flayan konfig\u00fcrasyon parametreleri sunulmaktad\u0131r,<\/li>\n<li>Birden fazla istemcinin ba\u011flanmas\u0131na olanak sa\u011flar,<\/li>\n<li>QT C++ statik k\u00fct\u00fcphane projesidir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>UDP:<\/strong>\n<ul>\n<li>UDP\/IP haberle\u015fme protokol\u00fc kullanarak, akranlar aras\u0131 UDP haberle\u015fmesi i\u00e7in ihtiya\u00e7 duyulan i\u015flevleri sunar,<\/li>\n<li>Gerekli ayarlar\u0131n yap\u0131lmas\u0131na olanak sa\u011flayan konfig\u00fcrasyon parametreleri sunulmaktad\u0131r,<\/li>\n<li>QT C++ statik k\u00fct\u00fcphane projesidir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>NetworkUtility:<\/strong>\n<ul>\n<li>A\u011f alt yap\u0131s\u0131 ile ilgili bir tak\u0131m yard\u0131mc\u0131 servisler (haberle\u015fme cihazlar\u0131, IP adresleri, vb) sunan k\u00fct\u00fcphanedir,<\/li>\n<li>QT C++ statik k\u00fct\u00fcphane projesidir.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u015eimdi de h\u0131zl\u0131ca di\u011fer ekledi\u011fimiz projelerin i\u015flevlerine ve ne yapacaklar\u0131na h\u0131zl\u0131ca bakal\u0131m. Bunlar\u0131n bir k\u0131sm\u0131n\u0131 tekrar kullansak da, bir k\u0131sm\u0131n\u0131 da bu yaz\u0131 dizileri boyunca geli\u015ftirmeye devam ediyor olaca\u011f\u0131z.<\/p>\n<ul>\n<li><strong>MessageCommon:<\/strong>\n<ul>\n<li>QT C++ statik k\u00fct\u00fcphane projesidir,<\/li>\n<li>Bu k\u00fct\u00fcphane i\u00e7erisinde, uygulama izleme yaz\u0131l\u0131m\u0131 haberle\u015fmelerinde kullanaca\u011f\u0131m\u0131z aray\u00fcz ve temel s\u0131n\u0131flar\u0131n\u0131 i\u00e7erir. Nelerdir bunlar:\n<ul>\n<li><em>IMsgListener<\/em>:\n<ul>\n<li>Haberle\u015fme kanallar\u0131 \u00fczerinden gelen mesajlar\u0131n aktar\u0131laca\u011f\u0131 s\u0131n\u0131flar i\u00e7in aray\u00fcz s\u0131n\u0131f.<\/li>\n<\/ul>\n<\/li>\n<li><em>IMsgProtocol<\/em>:\n<ul>\n<li>Uygulama izleme yaz\u0131l\u0131m\u0131 ve istemciler aras\u0131nda kullan\u0131lacak farkl\u0131 protokoller i\u00e7in kullan\u0131lacak aray\u00fcz s\u0131n\u0131f,<\/li>\n<li>Bu aray\u00fcz sayesinde farkl\u0131 mesajlasma protokolleri desteklenecektir.<\/li>\n<\/ul>\n<\/li>\n<li><em>ConnectionBase<\/em>:\n<ul>\n<li>Uygulama izleme yaz\u0131l\u0131m\u0131 ile, istemciler aras\u0131nda haberle\u015fme protokol\u00fcnden ba\u011f\u0131ms\u0131z bir mekanizma i\u00e7in kullan\u0131lacak temel s\u0131n\u0131ft\u0131r,<\/li>\n<li>Bu aray\u00fcz sayesinde izleme i\u00e7in ba\u011flanan s\u0131n\u0131f\u0131n kulland\u0131\u011f\u0131 haberle\u015fme y\u00f6nteminden kendimizi soyutlayaca\u011f\u0131z.<\/li>\n<\/ul>\n<\/li>\n<li><em>CommonMsgHdrData<\/em>:\n<ul>\n<li>Haberle\u015fme i\u00e7in kullanaca\u011f\u0131m\u0131z b\u00fct\u00fcn mesajlara ili\u015fkin ortak bilgileri tutacak veri yap\u0131s\u0131d\u0131r.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>MessageLibrary:<\/strong>\n<ul>\n<li>QT C++ statik k\u00fct\u00fcphane projesidir,<\/li>\n<li>Uygulama izleme yaz\u0131l\u0131m\u0131 ile istemciler aras\u0131nda iletilen mesajlara ili\u015fkin s\u0131n\u0131f ve yard\u0131mc\u0131 veri yap\u0131lar\u0131n\u0131 i\u00e7eren k\u00fct\u00fcphanedir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>DefaultCommProtocol:<\/strong>\n<ul>\n<li>QT C++ dinamik k\u00fct\u00fcphane projesidir,<\/li>\n<li>IMsgProtocol aray\u00fcz\u00fcnden t\u00fcretilen ve uygulama yaz\u0131l\u0131m\u0131m\u0131z i\u00e7in kullanaca\u011f\u0131m\u0131z varsay\u0131lan haberle\u015fme protokol\u00fcn\u00fc ger\u00e7ekler.<\/li>\n<\/ul>\n<\/li>\n<li><strong>AMTHostQmlApp:<\/strong>\n<ul>\n<li>QML uygulama projesidir,<\/li>\n<li>Uygulama izleme yaz\u0131l\u0131m\u0131n\u0131, QML kullanarak geli\u015ftiriyor olaca\u011f\u0131z. Bunun i\u00e7in a\u011f alt yap\u0131s\u0131 k\u00fct\u00fcphanelerini QML ile birlikte kullanaca\u011f\u0131z ama bu yaz\u0131da \u00e7ok detaya girmeyece\u011fiz.<\/li>\n<\/ul>\n<\/li>\n<li><strong>ClientTestApp:<\/strong>\n<ul>\n<li>QT C++ uygulama projesidir,<\/li>\n<li>Uygulama izleme yaz\u0131l\u0131m\u0131n\u0131 geli\u015ftirirken, ilgili kabiliyetleri denemek i\u00e7in kullanaca\u011f\u0131m\u0131z \u00f6rnek QT C++ projesidir<\/li>\n<\/ul>\n<\/li>\n<li><strong>QtDLLTestApp:<\/strong>\n<ul>\n<li>QT C++ uygulama projesidir,<\/li>\n<li>DefaultCommProtocol dinamik k\u00fct\u00fcphanesinin nas\u0131l kullan\u0131laca\u011f\u0131na ili\u015fkin \u00f6rnek bir projedir.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Ayr\u0131ca build dizini alt\u0131nda bir batch dosyas\u0131 (Build.bat) da ekledim. Vs2019 i\u00e7in gerekli dosyalar\u0131 t\u0131klayarak olu\u015fturabilirsiniz.<\/p>\n<p>Repo&#8217;nun son halini her zamanki gibi <span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/gitlab.com\/yazilimperver\/applicationmonitoringtool\">https:\/\/gitlab.com\/yazilimperver\/applicationmonitoringtool<\/a><\/strong><\/span> adresinden indirebilirsiniz.<\/p>\n<p>\u015eimdi art\u0131k CMake ile ilgili konulara dalabiliriz.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>CMake&#8217;e Dair Hususlar<\/strong><\/span><\/h2>\n<p>Bu ba\u015fl\u0131k alt\u0131nda yukar\u0131daki projelerde CMake&#8217;e ili\u015fkin kullan\u0131lan mekanizmalara de\u011finece\u011fiz. Bunu yaparken de, proje tiplerini referans al\u0131yor olaca\u011f\u0131z ve olabildi\u011fince ayn\u0131 tip projeler i\u00e7in ayn\u0131 yakla\u015f\u0131m\u0131 kullan\u0131yor olaca\u011f\u0131m. B\u00fct\u00fcnl\u00fc\u011f\u00fc korumak ve kopmama ad\u0131na, \u00f6nceki uygulama izleme yaz\u0131l\u0131m\u0131 yaz\u0131lar\u0131ma bakman\u0131zda fayda var.<\/p>\n<p>\u00d6ncelikle genel bir ka\u00e7 konudan bahsedeyim:<\/p>\n<ul>\n<li>CMake betikleri i\u00e7erisinde ayn\u0131 ismi dola\u015ft\u0131rmamak ad\u0131na, CMakeLists.txt i\u00e7erisinde proje tipine g\u00f6re LIB_NAME ve APP_NAME de\u011fi\u015fkenleri tan\u0131mlayarak kulland\u0131m (${LIB_NAME}, ${APP_NAME}),<\/li>\n<li>IDE i\u00e7erisinde g\u00f6sterilecek olan dosyalar SOURCE_FILES, HEADER_FILES ve duruma g\u00f6re RESOURCE_FILES ve QML_FILES olarak grupland\u0131rd\u0131k,<\/li>\n<li>Ayr\u0131ca cmake komutunu \u00e7al\u0131\u015ft\u0131r\u0131rken &#8220;-DCMAKE_PREFIX_PATH=&#8221;C:\\Qt5_14\\5.15.0\\msvc2019_64\\lib\\cmake&#8221; k\u0131sm\u0131n\u0131 da ekliyoruz. \u00d6r. Vs2019 i\u00e7in \u015f\u00f6yle bir komut oluyor:\n<ul>\n<li>cmake .. -G &#8220;Visual Studio 16 2019&#8243; -A x64 -DCMAKE_PREFIX_PATH=&#8221;C:\\Qt5_14\\5.15.0\\msvc2019_64\\lib\\cmake&#8221;<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3><span style=\"color: #0000ff;\"><strong>Statik QT C++ K\u00fct\u00fcphaneleri<\/strong><\/span><\/h3>\n<p>\u00d6ncelikle, statik QT C++ k\u00fct\u00fcphaneleri i\u00e7in kulland\u0131\u011f\u0131m\u0131z CMake betiklerine bakal\u0131m. Bu projelerin \u00e7\u0131kt\u0131s\u0131, windows sistemler i\u00e7in .lib, unix ve benzeri sistemler i\u00e7in .a uzant\u0131l\u0131 olacakt\u0131r. \u015eimdi, CMake i\u00e7erisinde bu tarz k\u00fct\u00fcphaneler i\u00e7in neler yapt\u0131\u011f\u0131m\u0131za madde madde bakal\u0131m:<\/p>\n<ul>\n<li>QT Moc (<em>Meta Object Compiler<\/em>), Rcc (<em>Resource Compiler<\/em>) ve Uic (<i>User Interface Compiler<\/i>) ara\u00e7lar\u0131na ili\u015fkin ayarlamalar i\u00e7in a\u015fa\u011f\u0131daki sat\u0131rlar\u0131 ekliyoruz:\n<ul>\n<li>set(CMAKE_AUTOMOC ON)<br \/>\nset(CMAKE_AUTORCC ON)<br \/>\nset(CMAKE_AUTOUIC ON)<\/li>\n<\/ul>\n<\/li>\n<li>Mevcut kod ve olu\u015fturma dizinlerini otomatik olarak eklemek i\u00e7in a\u015fa\u011f\u0131daki komutu ekliyoruz:\n<ul>\n<li>set(CMAKE_INCLUDE_CURRENT_DIR ON)<\/li>\n<\/ul>\n<\/li>\n<li>Qt ile ilgili ihtiya\u00e7 duyulan paketleri belirtiyoruz. Burada \u00f6rne\u011fin &#8220;Core, Network&#8221; Qt k\u00fct\u00fcphaneleri ekleniyor. Bunlar\u0131 da projeye g\u00f6re belirlemelisiniz. \u00d6r:\n<ul>\n<li>find_package(Qt5 REQUIRED COMPONENTS <strong>Core Network<\/strong>)<\/li>\n<\/ul>\n<\/li>\n<li>Ayr\u0131ca, kulland\u0131\u011f\u0131n\u0131z QT k\u00fct\u00fcphanelerine ili\u015fkin ba\u015fl\u0131k dosya dizinlerini de eklemelisiniz. \u00d6r:\n<ul>\n<li>target_include_directories(${LIB_NAME} PUBLIC ${Qt5Core_INCLUDE_DIRS})<br \/>\ntarget_include_directories(${LIB_NAME} PUBLIC ${Qt5Network_INCLUDE_DIRS})<\/li>\n<\/ul>\n<\/li>\n<li>Son olarak statik k\u00fct\u00fcphane olmas\u0131 sebebi ile &#8220;STATIC&#8221; anahtar kelimesini ekliyoruz:\n<ul>\n<li>add_library(${LIB_NAME} <strong>STATIC <\/strong>${HEADER_FILES} ${SOURCE_FILES})<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Temel olarak CMake \u00fczerinde QT statik k\u00fct\u00fcphanelerine ili\u015fkin \u00f6ne \u00e7\u0131kan ve minimum ayarlar bunlard\u0131r. Elbette bunlar\u0131n yan\u0131nda bir \u00e7ok ayar daha mevcut. Fakat, bir ba\u015flang\u0131\u00e7 i\u00e7in bunlar\u0131n yeterli olaca\u011f\u0131n\u0131 d\u00fc\u015f\u00fcn\u00fcyorum. \u015eimdi de, tam bir QT statik k\u00fct\u00fcphane CMake betik \u00f6rne\u011fine bakal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true\">cmake_minimum_required(VERSION 3.10)\r\n\r\n# \u0130simlendirme\r\nset(LIB_NAME UDP)\r\n\r\n# Baslik dosyalarini ayri tutma kararimiz isiginda ilgili dosyalari ekleyelim\r\nset(INCLUDE_FOLDER \"${ApplicationMonitorTool_SOURCE_DIR}\/include\")\r\n\r\n# Baslik dosyalari\r\nset(HEADER_FILES\r\n    \"${INCLUDE_FOLDER}\/${LIB_NAME}\/IPeerMedium.h\"\r\n    \"${INCLUDE_FOLDER}\/${LIB_NAME}\/UDPPeer.h\"\r\n)\r\n\r\n# Baslik dosya grubu (VS altindaki filtre gibi)\r\nsource_group(\"Header Files\" FILES ${HEADER_FILES})\r\n\r\n# Kaynak kod dosyalari\r\nset(SOURCE_FILES\r\n    \"UDPPeer.cpp\")\r\n\r\n# QT ayarlari\r\n# Asagidaki ayarlar sayesinde MOC, UIC ve RCC araclari tetiklettiriliyor\r\nset(CMAKE_AUTOMOC ON)\r\nset(CMAKE_AUTORCC ON)\r\nset(CMAKE_AUTOUIC ON)\r\n\r\n# Kaynak ve olu\u015fturma dizinlerini otomatik olarak ba\u015fl\u0131k dosyas\u0131 dizinine ekler\r\nset(CMAKE_INCLUDE_CURRENT_DIR ON)\r\n\r\n# Gerekli paketleri belirtelim\r\nfind_package(Qt5 REQUIRED COMPONENTS Core Network)\r\n\r\n# Kaynak dosya grubu (VS altindaki filtre gibi)\r\nsource_group(\"Source Files\" FILES ${SOURCE_FILES})\r\n\r\n# Windows icin bir kac ek tanimlama\r\nif(WIN32)\r\n    add_definitions(-D_CRT_SECURE_NO_WARNINGS)\r\nendif()    \r\n\r\n# Statik kutuphane olarak bu projeyi ekliyoruz\r\nadd_library(${LIB_NAME} STATIC ${HEADER_FILES} ${SOURCE_FILES})\r\n\r\n# Baslik dosyalarinin yolunu ekleyelim\r\ntarget_include_directories(${LIB_NAME} PUBLIC ${INCLUDE_FOLDER})\r\ntarget_include_directories(${LIB_NAME} PUBLIC ${INCLUDE_FOLDER}\/${LIB_NAME})\r\ntarget_include_directories(${LIB_NAME} PUBLIC  ${Qt5Core_INCLUDE_DIRS})\r\ntarget_include_directories(${LIB_NAME} PUBLIC  ${Qt5Network_INCLUDE_DIRS})\r\n\r\n# Bu projeyi VS icerisinde ayri bir folderda tutalim\r\nset_target_properties(${LIB_NAME} PROPERTIES FOLDER Src\/Libraries)<\/pre>\n<h3><span style=\"color: #0000ff;\"><strong>Dinamik QT C++ K\u00fct\u00fcphaneleri<\/strong><\/span><\/h3>\n<p>QT i\u00e7in haz\u0131rlayaca\u011f\u0131m\u0131z dinamik k\u00fct\u00fcphaneler de statik k\u00fct\u00fcphanelere olduk\u00e7a benziyorlar. Yanl\u0131z statik k\u00fct\u00fcphanelerden farkl\u0131 olarak dikkat etmemiz gereken bir ka\u00e7 nokta da var elbette. Nedir bunlar hemen bakal\u0131m:<\/p>\n<ul>\n<li>\u00d6ncelikle statik k\u00fct\u00fcphane i\u00e7in yazd\u0131\u011f\u0131m maddelerden sonuncu hari\u00e7 hepsi, dinamik QT k\u00fct\u00fcphaneleri i\u00e7in de ge\u00e7erli. add_library komutunu bu sefer &#8220;SHARED&#8221; anahtar kelimesi ile kullan\u0131yoruz:\n<ul>\n<li>add_library(${LIB_NAME} <strong>SHARED<\/strong> ${HEADER_FILES} ${SOURCE_FILES})<\/li>\n<\/ul>\n<\/li>\n<li>Ayr\u0131ca, statik k\u00fct\u00fcphaneden farkl\u0131 olarak, QT k\u00fct\u00fcphanelerini ba\u011flamak i\u00e7in\u00a0<em>target_link_libraries\u00a0<\/em>komutunu da, ilgili QT k\u00fct\u00fcphaneleri i\u00e7in eklememiz gerekiyor:\n<ul>\n<li>target_link_libraries(${LIB_NAME} MessageCommon Qt5::Core)<\/li>\n<\/ul>\n<\/li>\n<li>Windows i\u00e7in .DLL&#8217;e dair tan\u0131mlama dosyas\u0131n\u0131, b\u00fct\u00fcn global semboller ile olu\u015fturmak i\u00e7in a\u015fa\u011f\u0131daki ifadeyi de ekliyoruz:\n<ul>\n<li>set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS 1)<\/li>\n<\/ul>\n<\/li>\n<li>Yukar\u0131daki kalemin yan\u0131nda, dinamik k\u00fct\u00fcphane taraf\u0131ndan sembollerin do\u011fru bir \u015fekilde d\u0131\u015far\u0131 sunulmas\u0131 i\u00e7in de, bir tan\u0131mlama ekliyoruz. Benzer \u015fekilde bu makroyu, kod i\u00e7erisinde de ilgili s\u0131n\u0131f ve fonksiyonlar\u0131n \u00f6n\u00fcnde kullanmam\u0131z gerekiyor (bak\u0131n\u0131z DefaultCommProtocol.h dosyas\u0131na):\n<ul>\n<li>add_definitions(-DDEFAULT_COMM_PROTOCOL_LIB_LIBRARY)<\/li>\n<\/ul>\n<\/li>\n<li>Son olarak dinamik k\u00fct\u00fcphaneler i\u00e7in gerekli &#8220;export&#8221; makrolar\u0131n\u0131 olu\u015fturmak i\u00e7in a\u015fa\u011f\u0131daki sat\u0131rlar\u0131 ekliyoruz. Bu fonksiyon i\u00e7in kaynaklara koydu\u011fum adrese bakabilirsiniz. Bir \u00e7ok parametre i\u00e7eriyor.\n<ul>\n<li>generate_export_header(${LIB_NAME}<br \/>\nBASE_NAME ${LIB_NAME}<br \/>\nEXPORT_MACRO_NAME DEFAULT_COMM_PROTOCOL_LIB_EXPORT<br \/>\nEXPORT_FILE_NAME ${LIB_NAME}_Export.h<br \/>\nSTATIC_DEFINE DEFAULT_COMM_PROTOCOL_BUILT_AS_STATIC)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u015eimdi de, tam bir QT dinamik k\u00fct\u00fcphane CMake betik \u00f6rne\u011fine bakal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true\">include (GenerateExportHeader)\r\n\r\ncmake_minimum_required(VERSION 3.10)\r\n\r\n# \u0130simlendirme\r\nset(LIB_NAME DefaultCommProtocol)\r\n\r\n# Baslik dosyalarini ayri tutma kararimiz isiginda ilgili dosyalari ekleyelim\r\nset(INCLUDE_FOLDER \"${ApplicationMonitorTool_SOURCE_DIR}\/include\")\r\n\r\n# Baslik dosyalari\r\nset(HEADER_FILES\r\n    \"${INCLUDE_FOLDER}\/${LIB_NAME}\/DefaultCommProtocol.h\"\r\n)\r\n\r\n# Baslik dosya grubu (VS altindaki filtre gibi)\r\nsource_group(\"Header Files\" FILES ${HEADER_FILES})\r\n\r\n# Kaynak kod dosyalari\r\nset(SOURCE_FILES\r\n    \"DefaultCommProtocol.cpp\"\r\n)\r\n\r\n# QT ayarlari\r\n# Turn on automatic invocation of the MOC, UIC &amp; RCC\r\nset(CMAKE_AUTOMOC ON)\r\nset(CMAKE_AUTORCC ON)\r\nset(CMAKE_AUTOUIC ON)\r\n\r\n# Find includes in corresponding build directories\r\nset(CMAKE_INCLUDE_CURRENT_DIR ON)\r\n\r\nfind_package(Qt5 REQUIRED COMPONENTS Core)\r\n\r\n# Kaynak dosya grubu (VS altindaki filtre gibi)\r\nsource_group(\"Source Files\" FILES ${SOURCE_FILES})\r\n\r\n# Windows icin bir kac ek tanimlama\r\nif(WIN32)\r\n    add_definitions(-D_CRT_SECURE_NO_WARNINGS)\r\n    set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS 1)\r\nendif() \r\n\r\n# Kutuphane tanimlamalarini disari aktarmak icin gerekli tanimlama\r\nadd_definitions(-DDEFAULT_COMM_PROTOCOL_LIB_LIBRARY)\r\n\r\n# Dinamik kutuphane olarak bu projeyi ekliyoruz\r\nadd_library(${LIB_NAME} SHARED ${HEADER_FILES} ${SOURCE_FILES})\r\n\r\ngenerate_export_header(${LIB_NAME}\r\n             BASE_NAME ${LIB_NAME}\r\n             EXPORT_MACRO_NAME DEFAULT_COMM_PROTOCOL_LIB_EXPORT\r\n             EXPORT_FILE_NAME ${LIB_NAME}_Export.h\r\n             STATIC_DEFINE DEFAULT_COMM_PROTOCOL_BUILT_AS_STATIC\r\n)\r\n\r\n# Baslik dosyalarinin yolunu ekleyelim\r\ntarget_include_directories(${LIB_NAME} PUBLIC ${INCLUDE_FOLDER})\r\ntarget_include_directories(${LIB_NAME} PUBLIC ${INCLUDE_FOLDER}\/${LIB_NAME})\r\ntarget_include_directories(${LIB_NAME} PUBLIC  ${Qt5Core_INCLUDE_DIRS})\r\n\r\n# kutuphaneleri baglayalim\r\ntarget_link_libraries(${LIB_NAME} MessageCommon Qt5::Core)\r\n\r\n# Bu projeyi VS icerisinde ayri bir folderda tutalim\r\nset_target_properties(${LIB_NAME} PROPERTIES FOLDER Src\/Libraries)\r\n<\/pre>\n<h3><span style=\"color: #0000ff;\"><strong>QT C++ Uygulamalar\u0131<\/strong><\/span><\/h3>\n<p>QT i\u00e7in haz\u0131rlayaca\u011f\u0131m\u0131z uygulamalara bakal\u0131m \u015fimdi de. \u00d6ncelikle, QT C++\u00a0 uygulamas\u0131na bakal\u0131m. Burada da k\u00fct\u00fcphane projeleri ile ortak kodlar mevcut nedir. Bunlar\u0131n yan\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131labilir uygulama olmas\u0131 sebebi ile de bir ka\u00e7 ek fonksyion \u00e7a\u011f\u0131rmam\u0131z gerekiyor:<\/p>\n<ul>\n<li>find_package, fonksiyonunu yine kullan\u0131yoruz,<\/li>\n<li>.ui dosyalar\u0131 i\u00e7in ayr\u0131 bir grupland\u0131rma yap\u0131p, bunlar\u0131 da, nihai \u00e7al\u0131\u015ft\u0131r\u0131labilir dosya fonksiyonuna dahil ediyoruz,<\/li>\n<li>.ui dosyalar\u0131n\u0131 bulmas\u0131 i\u00e7in a\u015fa\u011f\u0131daki komutu ekliyoruz:\n<ul>\n<li>set(CMAKE_AUTOUIC_SEARCH_PATHS .)<\/li>\n<\/ul>\n<\/li>\n<li>Kulland\u0131\u011f\u0131m\u0131z\u00a0<strong>statik k\u00fct\u00fcphaneler\u00a0<\/strong>ile QT k\u00fct\u00fcphanelerini ekliyoruz:\n<ul>\n<li>target_link_libraries(${APP_NAME} Utility MessageCommon UDP Qt5::Widgets Qt5::Core Qt5::Network)<\/li>\n<\/ul>\n<\/li>\n<li>\u00c7al\u0131\u015ft\u0131r\u0131labilir dosya \u00e7\u0131kt\u0131s\u0131n\u0131n debug\/release ayr\u0131 isimlendirmesi i\u00e7in a\u015fa\u011f\u0131daki komutu kullanabilirsiniz (ya da en tepedeki cmake beti\u011findeki komutu da kullanabilirsiniz):\n<ul>\n<li>set_target_properties(${APP_NAME} PROPERTIES OUTPUT_NAME_DEBUG ${APP_NAME}D )<br \/>\nset_target_properties(${APP_NAME} PROPERTIES OUTPUT_NAME_RELEASE ${APP_NAME} )<\/li>\n<\/ul>\n<\/li>\n<li>Son olarak da, yaz\u0131mda en \u00e7ok ho\u015funuza gidece\u011fin d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm bir kod par\u00e7as\u0131ndan bahsedece\u011fim. QT .dll ve di\u011fer ba\u011f\u0131ml\u0131l\u0131klar\u0131n olu\u015fturulan \u00e7al\u0131\u015ft\u0131r\u0131labilir dosyan\u0131n yan\u0131na al\u0131nmas\u0131. Bu kod temelde, QT&#8217;nin kurulum dizinine ve kullan\u0131lan QT&#8217;ye g\u00f6re, ilgili dizine gidip, <em>windeployqt\u00a0<\/em>arac\u0131n\u0131 ca\u011f\u0131r\u0131yor ve ba\u011f\u0131ml\u0131l\u0131klar\u0131, \u00e7\u0131kt\u0131n\u0131n yan\u0131na kopyal\u0131yor (<span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/24\/qt-uygulamalarinin-konuslandirilmasi\/\">bu araca da, daha \u00f6nce de\u011finmi\u015ftim<\/a><\/strong><\/span>). Biraz uzun oldu\u011fu i\u00e7in buraya eklemiyorum. A\u015fa\u011f\u0131da \u00e7al\u0131\u015ft\u0131r\u0131labilir QT uygulamas\u0131na ili\u015fkin CMake beti\u011fini g\u00f6rebilirsiniz. Son k\u0131sm\u0131nda yer alan kod par\u00e7as\u0131, bu ama\u00e7la kullan\u0131lmaktad\u0131r:<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">cmake_minimum_required(VERSION 3.10)\r\n\r\n# \u0130simlendirme\r\nset(APP_NAME ClientTestApp)\r\n\r\n# Qt'ye iliskin kullanacagim bilesenleri burada veriyoruz\r\nfind_package(Qt5 REQUIRED COMPONENTS Core Widgets Network)\r\n\r\n# QT ayarlari\r\n# Asagidaki ayarlar sayesinde MOC, UIC ve RCC araclari tetiklettiriliyor\r\nset(CMAKE_AUTOMOC ON)\r\nset(CMAKE_AUTOUIC ON)\r\n\r\n# Baslik dosyalarini ayri tutma kararimiz isiginda ilgili dosyalari ekleyelim\r\nset(INCLUDE_FOLDER \"${ApplicationMonitorTool_SOURCE_DIR}\/include\")\r\n\r\n# UI dosyalari icin bakilacak dizinlere ufak bir dokunus\r\nset(CMAKE_AUTOUIC_SEARCH_PATHS .)\r\n\r\n# Olusturma dizinlerine de baslik dosyalari icin bakilmasina yonelik bir ayar\r\nset(CMAKE_INCLUDE_CURRENT_DIR ON)\r\n\r\n# Baslik dosyalari\r\nset(HEADER_FILES\r\n    \"${INCLUDE_FOLDER}\/${APP_NAME}\/ClientTestApp.h\"\r\n)\r\n\r\n# Baslik dosya grubu (VS altindaki filtre gibi)\r\nsource_group(\"Header Files\" FILES ${HEADER_FILES})\r\n\r\n# Kaynak kod dosyalari\r\nset(SOURCE_FILES\r\n    ClientTestApp.cpp\r\n    main.cpp  )\r\n\r\n# Kaynak dosya grubu (VS altindaki filtre gibi)\r\nsource_group(\"Source Files\" FILES ${SOURCE_FILES})\r\n\r\nset(FORM_FILES\r\n    ClientTestApp.ui )\r\n\r\n# Kaynak dosya grubu (VS altindaki filtre gibi)\r\nsource_group(\"Form Files\" FILES ClientTestApp.ui)\r\n\r\n# Windows icin bir kac ek tanimlama\r\nif(WIN32)\r\n    add_definitions(-D_CRT_SECURE_NO_WARNINGS)\r\nendif()    \r\n\r\n# Windows GUI Calistirilabilir dosyas\u0131 haline getirelim\r\nif(WIN32)\r\n  set(CMAKE_WIN32_EXECUTABLE ON)\r\nendif()\r\n\r\n# Calistirilabilir dosya olarak bu projeyi ekliyoruz\r\nadd_executable(${APP_NAME} ${HEADER_FILES} ${FORM_FILES} ${SOURCE_FILES} ${UI_HEADERS})\r\n\r\n# kutuphaneleri baglayalim\r\ntarget_link_libraries(${APP_NAME} Utility MessageCommon Udp Qt5::Widgets Qt5::Core Qt5::Network)\r\n\r\n# Baslik dosyalarinin yolunu ekleyelim\r\ntarget_include_directories(${APP_NAME} PUBLIC ${INCLUDE_FOLDER})\r\ntarget_include_directories(${APP_NAME} PUBLIC ${INCLUDE_FOLDER}\/${APP_NAME})\r\ntarget_include_directories(${APP_NAME} PUBLIC ${Qt5Core_INCLUDE_DIRS})\r\ntarget_include_directories(${APP_NAME} PUBLIC ${Qt5Widgets_INCLUDE_DIRS})\r\ntarget_include_directories(${APP_NAME} PUBLIC ${Qt5Network_INCLUDE_DIRS})\r\n\r\n# Bu projeyi VS icerisinde ayri bir folderda tutalim\r\nset_target_properties(${APP_NAME} PROPERTIES FOLDER Src\/Apps)\r\n\r\n# Debug\/release farki icin\r\nset_target_properties(${APP_NAME} PROPERTIES OUTPUT_NAME_DEBUG ${APP_NAME}D )\r\nset_target_properties(${APP_NAME} PROPERTIES OUTPUT_NAME_RELEASE ${APP_NAME} )\r\n\r\n# Qt ba\u011f\u0131ml\u0131klar\u0131n\u0131 otomatik \u00e7ekmek i\u00e7in\r\nif(Qt5_FOUND AND WIN32 AND TARGET Qt5::qmake AND NOT TARGET Qt5::windeployqt)\r\n    get_target_property(_qt5_qmake_location Qt5::qmake IMPORTED_LOCATION)\r\n\r\n    execute_process(\r\n        COMMAND \"${_qt5_qmake_location}\" -query QT_INSTALL_PREFIX\r\n        RESULT_VARIABLE return_code\r\n        OUTPUT_VARIABLE qt5_install_prefix\r\n        OUTPUT_STRIP_TRAILING_WHITESPACE\r\n    )\r\n\r\n    set(imported_location \"${qt5_install_prefix}\/bin\/windeployqt.exe\")\r\n\r\n    if(EXISTS ${imported_location})\r\n        add_executable(Qt5::windeployqt IMPORTED)\r\n\r\n        set_target_properties(Qt5::windeployqt PROPERTIES\r\n            IMPORTED_LOCATION ${imported_location}\r\n        )\r\n    endif()\r\nendif()\r\n\r\n# Qt bagimliliklarin kopyalayalim\r\nif(TARGET Qt5::windeployqt)\r\n    # execute windeployqt in a tmp directory after build\r\n    add_custom_command(TARGET ${APP_NAME}\r\n        POST_BUILD\r\n        COMMAND ${CMAKE_COMMAND} -E remove_directory \"${CMAKE_CURRENT_BINARY_DIR}\/windeployqt\"\r\n        COMMAND set PATH=%PATH%$&lt;SEMICOLON&gt;${qt5_install_prefix}\/bin\r\n        COMMAND Qt5::windeployqt --dir \"${CMAKE_SOURCE_DIR}\/binary\" \"$&lt;TARGET_FILE_DIR:${APP_NAME}&gt;\/$&lt;TARGET_FILE_NAME:${APP_NAME}&gt;\"\r\n    )\r\nendif()<\/pre>\n<p>QtDLLTestApp uygulamas\u0131na ili\u015fkin de CMake beti\u011fi, yukar\u0131daki beti\u011fe \u00e7ok benzemektedir.<\/p>\n<h3><span style=\"color: #0000ff;\"><strong>QT QML Uygulamalar\u0131<\/strong><\/span><\/h3>\n<p>Son olarak gelelim, QML uygulamalar\u0131na ili\u015fkin CMake beti\u011fine ve \u00f6nemli noktalara. Asl\u0131nda, QT uygulamalar\u0131 i\u00e7in ge\u00e7erli komutlar\u0131n \u00e7o\u011fu QML uygulamalar\u0131 i\u00e7in de ge\u00e7erlidir ama bir ka\u00e7 ek husus var:<\/p>\n<ul>\n<li>QML uygulamalar\u0131 i\u00e7in CMAKE_AUTOMOC ve benzeri ayarlara ihtiya\u00e7 duymayaca\u011f\u0131z (.ui dosyas\u0131 olmad\u0131\u011f\u0131 m\u00fcddet\u00e7e),<\/li>\n<li>QML dosyas\u0131n\u0131 da i\u00e7erisinde bar\u0131nd\u0131ran .qrc dosyas\u0131n\u0131 a\u015fa\u011f\u0131daki komut ile ekliyoruz\n<ul>\n<li>qt5_add_resources(QT_RESOURCES qml.qrc)<\/li>\n<\/ul>\n<\/li>\n<li>Ba\u015fl\u0131k, kaynak ve QML dosyalar\u0131 ile qrc dosyas\u0131n\u0131 da \u00e7al\u0131\u015ft\u0131r\u0131labilir dosya komutuna ekliyoruz\n<ul>\n<li>add_executable(AMTHostQmlApp ${HEADER_FILES} ${SOURCE_FILES} ${QML_FILES} ${QT_RESOURCES})<\/li>\n<\/ul>\n<\/li>\n<li>Son olarak, windeployqt komutunu, qml dosyalar\u0131 i\u00e7in biraz uyarlamam\u0131z gerekiyor. Bu da \u00e7ok ince bir nokta dikkat:\n<ul>\n<li>COMMAND Qt5::windeployqt <strong>&#8211;qmldir<\/strong> &#8220;${CMAKE_CURRENT_SOURCE_DIR}&#8221; &#8220;$&lt;TARGET_FILE_DIR:${APP_NAME}&gt;\/$&lt;TARGET_FILE_NAME:${APP_NAME}&gt;&#8221;<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2><span style=\"color: #0000ff;\"><strong>Sonu\u00e7<\/strong><\/span><\/h2>\n<p>Evet, uygulama izleme yaz\u0131l\u0131m\u0131m\u0131z ve QT uygulamalar\u0131 i\u00e7in san\u0131r\u0131m gerekli \u00e7o\u011fu CMake komutunun \u00fczerinden ge\u00e7mi\u015f olduk. CMake i\u00e7in de \u00e7ok iyi bir referans olaca\u011f\u0131 kan\u0131s\u0131nday\u0131m, umar\u0131m sizler i\u00e7in de faydal\u0131 olur.<\/p>\n<p>Burada, dikkatli okuyucular\u0131m \u00f6zellikle, MessageCommon, MessageLibrary, DefaultCommProtocol ve QT&#8217;de dinamik k\u00fct\u00fcphane kullan\u0131m konular\u0131na \u00e7ok girmedi\u011fimi fark etmi\u015fssinizdir. A\u00e7\u0131k\u00e7as\u0131, CMake ile olan konu da\u011f\u0131lmas\u0131n ve yaz\u0131 da daha fazla uzamas\u0131n diye girmedim ama kodlar\u0131 gitlaba ekliyorum. Merak edenler, inceleyebilirler.<\/p>\n<p>Ayr\u0131ca kaynaklar k\u0131sm\u0131na da, g\u00fczel siteler b\u0131rak\u0131yorum onlara da bakmay\u0131 unutmay\u0131n l\u00fctfen.<\/p>\n<p>Bir sonraki yaz\u0131ma kadar kendinize \u00e7ok iyi bak\u0131n ve sa\u011fl\u0131kla kal\u0131n sevgili yaz\u0131l\u0131mperver dostlar\u0131m.<\/p>\n<p><strong>Not:<\/strong> Kodlar\u0131 y\u00fckledikten sonra gitlabda bir ki\u00e7 kere pipeline patlad\u0131. Ufak tefek bir ka\u00e7 hata d\u0131\u015f\u0131nda (.ui arama dizini yanl\u0131\u015f olmu\u015f, proje isimlerinde b\u00fcy\u00fck\/k\u00fc\u00e7\u00fck fark\u0131 olmu\u015f, vs.), uint64_t&#8217;leri qint64&#8217;e \u00e7evirmem gerekti (windows&#8217;ta ihtiya\u00e7 olmam\u0131\u015ft\u0131, gitlab ubuntu \u00fczerinde derliyor), bilginiz olsun. En son durumda pipeline da da bir s\u0131k\u0131nt\u0131 kalmad\u0131 \ud83d\ude09 Repo i\u00e7in:<\/p>\n<p><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/gitlab.com\/yazilimperver\/applicationmonitoringtool\"><strong>https:\/\/gitlab.com\/yazilimperver\/applicationmonitoringtool<\/strong><\/a><\/span><\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Kaynaklar<\/strong><\/span><\/h2>\n<ul>\n<li><a href=\"https:\/\/www.slideshare.net\/ICSinc\/an-introduction-to-cmake\"><span style=\"color: #008000;\"><strong>https:\/\/www.slideshare.net\/ICSinc\/an-introduction-to-cmake<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/cmake.org\/cmake\/help\/v3.4\/prop_tgt\/WINDOWS_EXPORT_ALL_SYMBOLS.html#prop_tgt:WINDOWS_EXPORT_ALL_SYMBOLS\"><span style=\"color: #008000;\"><strong>https:\/\/cmake.org\/cmake\/help\/v3.4\/prop_tgt\/WINDOWS_EXPORT_ALL_SYMBOLS.html#prop_tgt:WINDOWS_EXPORT_ALL_SYMBOLS<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/cmake.org\/cmake\/help\/latest\/module\/GenerateExportHeader.html\"><span style=\"color: #008000;\"><strong>https:\/\/cmake.org\/cmake\/help\/latest\/module\/GenerateExportHeader.html<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/cmake.org\/cmake\/help\/latest\/variable\/CMAKE_AUTOUIC_SEARCH_PATHS.html\"><span style=\"color: #008000;\"><strong>https:\/\/cmake.org\/cmake\/help\/latest\/variable\/CMAKE_AUTOUIC_SEARCH_PATHS.html<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/doc.qt.io\/qt-5\/cmake-manual.html\"><span style=\"color: #008000;\"><strong>https:\/\/doc.qt.io\/qt-5\/cmake-manual.html<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/wiki.qt.io\/How_to_create_a_library_with_Qt_and_use_it_in_an_application?veaction=edit\"><span style=\"color: #008000;\"><strong>https:\/\/wiki.qt.io\/How_to_create_a_library_with_Qt_and_use_it_in_an_application?veaction=edit<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/www.apriorit.com\/dev-blog\/475-qt-qml-with-cmake\"><span style=\"color: #008000;\"><strong>https:\/\/www.apriorit.com\/dev-blog\/475-qt-qml-with-cmake<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/225432\/export-all-symbols-when-creating-a-dll\"><span style=\"color: #008000;\"><strong>https:\/\/stackoverflow.com\/questions\/225432\/export-all-symbols-when-creating-a-dll<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/37128555\/getting-cmake-to-build-shared-library-for-msvc\"><span style=\"color: #008000;\"><strong>https:\/\/stackoverflow.com\/questions\/37128555\/getting-cmake-to-build-shared-library-for-msvc<\/strong><\/span><\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Evet dostlar, k\u0131sa bir ara verdikten sonra uygulama izleme yaz\u0131l\u0131m\u0131 yaz\u0131lar\u0131m\u0131za devam ediyoruz. Bu yaz\u0131m\u0131zda, CMake ile QT k\u00fct\u00fcphanelerimizi nas\u0131l konfig\u00fcre edebilirize bakaca\u011f\u0131z. Bunu da yaparken uygulama izleme yaz\u0131l\u0131m\u0131m\u0131z\u0131n par\u00e7alar\u0131n\u0131 olu\u015fturmaya devam edece\u011fiz. \u00d6nceki yaz\u0131lar\u0131m ile birlikte asl\u0131nda, uygulama i\u00e7in gerekli alt yap\u0131y\u0131 ve anlatmak istedi\u011fimi di\u011fer teknolojilere k\u0131sa da olsa de\u011finmi\u015f olduk. Bir s\u00fcre,&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[10,41,685],"tags":[13,155,510,471,855,854,591],"class_list":["post-2053","post","type-post","status-publish","format-standard","hentry","category-c","category-modern-c","category-qt","tag-c","tag-cmake","tag-qml","tag-qt","tag-qt-dinamik-kutuphaneler","tag-qt-statik-kutuphaneler","tag-windeployqt"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Uygulama \u0130zleme Yaz\u0131l\u0131m\u0131 4 - Qt Ayarlamalar\u0131 - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Uygulama \u0130zleme Yaz\u0131l\u0131m\u0131 4 - Qt Ayarlamalar\u0131 - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Evet dostlar, k\u0131sa bir ara verdikten sonra uygulama izleme yaz\u0131l\u0131m\u0131 yaz\u0131lar\u0131m\u0131za devam ediyoruz. Bu yaz\u0131m\u0131zda, CMake ile QT k\u00fct\u00fcphanelerimizi nas\u0131l konfig\u00fcre edebilirize bakaca\u011f\u0131z. Bunu da yaparken uygulama izleme yaz\u0131l\u0131m\u0131m\u0131z\u0131n par\u00e7alar\u0131n\u0131 olu\u015fturmaya devam edece\u011fiz. \u00d6nceki yaz\u0131lar\u0131m ile birlikte asl\u0131nda, uygulama i\u00e7in gerekli alt yap\u0131y\u0131 ve anlatmak istedi\u011fimi di\u011fer teknolojilere k\u0131sa da olsa de\u011finmi\u015f olduk. Bir s\u00fcre,... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-20T22:23:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-11-03T21:32:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2021\/03\/img_60562182443dd.png\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"Uygulama \u0130zleme Yaz\u0131l\u0131m\u0131 4 &#8211; Qt Ayarlamalar\u0131\",\"datePublished\":\"2021-03-20T22:23:38+00:00\",\"dateModified\":\"2021-11-03T21:32:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/\"},\"wordCount\":2590,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"c++\",\"CMAKE\",\"qml\",\"Qt\",\"QT Dinamik K\u00fct\u00fcphaneler\",\"QT Statik K\u00fct\u00fcphaneler\",\"windeployqt\"],\"articleSection\":[\"C++\",\"Modern C++\",\"QT\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/\",\"name\":\"Uygulama \u0130zleme Yaz\u0131l\u0131m\u0131 4 - Qt Ayarlamalar\u0131 - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2021-03-20T22:23:38+00:00\",\"dateModified\":\"2021-11-03T21:32:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Uygulama \u0130zleme Yaz\u0131l\u0131m\u0131 4 &#8211; Qt Ayarlamalar\u0131\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yazilimperver.com\/#website\",\"url\":\"https:\/\/www.yazilimperver.com\/\",\"name\":\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yazilimperver.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"contentUrl\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Uygulama \u0130zleme Yaz\u0131l\u0131m\u0131 4 - Qt Ayarlamalar\u0131 - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/","og_locale":"tr_TR","og_type":"article","og_title":"Uygulama \u0130zleme Yaz\u0131l\u0131m\u0131 4 - Qt Ayarlamalar\u0131 - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Evet dostlar, k\u0131sa bir ara verdikten sonra uygulama izleme yaz\u0131l\u0131m\u0131 yaz\u0131lar\u0131m\u0131za devam ediyoruz. Bu yaz\u0131m\u0131zda, CMake ile QT k\u00fct\u00fcphanelerimizi nas\u0131l konfig\u00fcre edebilirize bakaca\u011f\u0131z. Bunu da yaparken uygulama izleme yaz\u0131l\u0131m\u0131m\u0131z\u0131n par\u00e7alar\u0131n\u0131 olu\u015fturmaya devam edece\u011fiz. \u00d6nceki yaz\u0131lar\u0131m ile birlikte asl\u0131nda, uygulama i\u00e7in gerekli alt yap\u0131y\u0131 ve anlatmak istedi\u011fimi di\u011fer teknolojilere k\u0131sa da olsa de\u011finmi\u015f olduk. Bir s\u00fcre,... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2021-03-20T22:23:38+00:00","article_modified_time":"2021-11-03T21:32:26+00:00","og_image":[{"url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2021\/03\/img_60562182443dd.png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"Uygulama \u0130zleme Yaz\u0131l\u0131m\u0131 4 &#8211; Qt Ayarlamalar\u0131","datePublished":"2021-03-20T22:23:38+00:00","dateModified":"2021-11-03T21:32:26+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/"},"wordCount":2590,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["c++","CMAKE","qml","Qt","QT Dinamik K\u00fct\u00fcphaneler","QT Statik K\u00fct\u00fcphaneler","windeployqt"],"articleSection":["C++","Modern C++","QT"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/","name":"Uygulama \u0130zleme Yaz\u0131l\u0131m\u0131 4 - Qt Ayarlamalar\u0131 - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2021-03-20T22:23:38+00:00","dateModified":"2021-11-03T21:32:26+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/03\/20\/amt-4-qt-ayarlamalari\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Uygulama \u0130zleme Yaz\u0131l\u0131m\u0131 4 &#8211; Qt Ayarlamalar\u0131"}]},{"@type":"WebSite","@id":"https:\/\/www.yazilimperver.com\/#website","url":"https:\/\/www.yazilimperver.com\/","name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yazilimperver.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","contentUrl":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/2053","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=2053"}],"version-history":[{"count":20,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/2053\/revisions"}],"predecessor-version":[{"id":2340,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/2053\/revisions\/2340"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=2053"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=2053"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=2053"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}