{"id":494,"date":"2018-09-13T11:43:00","date_gmt":"2018-09-13T11:43:00","guid":{"rendered":"http:\/\/www.yazilimperver.com\/?p=494"},"modified":"2018-09-13T17:34:46","modified_gmt":"2018-09-13T17:34:46","slug":"cmake-devam","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/","title":{"rendered":"CMake &#8211; II (devam)"},"content":{"rendered":"<p>Evet arkada\u015flar CMake ile ilgili ikinci yaz\u0131m\u0131za ho\u015f geldiniz. \u0130lk yaz\u0131 i\u00e7in a\u015fa\u011f\u0131daki linki takip edebilirsiniz:<\/p>\n<p><span style=\"color: #339966;\"><strong><a style=\"color: #339966;\" href=\"http:\/\/www.yazilimperver.com\/index.php\/2018\/08\/28\/merhaba-cmake\/\">Merhaba CMake<\/a><\/strong><\/span><\/p>\n<p>Bu yaz\u0131mda CMake ile ilgili di\u011fer kabiliyetlere de\u011finip daha fazla \u00f6rnekleri inceleyece\u011fiz. \u015eunu belirtmem gerekiyor ki her konuda oldu\u011fu gibi CMake&#8217;i de en iyi \u00f6\u011frenme \u015fekillerinden biri kendi ki\u015fisel veya di\u011fer projelerinizde bunu kullanmak ve di\u011fer \u00f6rnek CMake kodlar\u0131n\u0131 incelemek. A\u00e7\u0131k\u00e7as\u0131 bu zamana kadar ben ikinci y\u00f6nteme daha fazla a\u011f\u0131rl\u0131k verdim ama bundan sonra ben de projelerimde CMake kullanmaya ba\u015flayaca\u011f\u0131m. Bu yaz\u0131da bahsedece\u011fim hususlar\u0131 ba\u015fl\u0131k ba\u015fl\u0131k vermeye \u00e7al\u0131\u015ft\u0131m. \u00d6rnek kodlar\u0131 a\u015fa\u011f\u0131daki adresten edinebilirsiniz:<\/p>\n<h2><strong><span style=\"color: #0000ff;\">De\u011fi\u015fken kullan\u0131m\u0131:<\/span><\/strong><\/h2>\n<p>* De\u011fi\u015fkenleri a\u015fa\u011f\u0131daki gibi tan\u0131mlayabiliyoruz (bunu ilk yaz\u0131mdan hat\u0131rl\u0131yorsunuzdur)<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true \">set (MY_VAR \"hello\")<\/pre>\n<p>sonras\u0131nda ise<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true \">set (OTHER_VAR \"${MY_VAR} world!\")<\/pre>\n<p>\u015feklinde kullanabiliyoruz. Ayr\u0131ca komut sat\u0131r\u0131ndan da bu de\u011fi\u015fkenlere de\u011fer atayabilirsiniz. Onun i\u00e7in de a\u015fa\u011f\u0131daki komutu kullanabilirsiniz:<\/p>\n<pre class=\"lang:c++ decode:true \"> cmake -DMY_VAR=Hello<\/pre>\n<h2><strong><span style=\"color: #0000ff;\">&#8220;Header&#8221; dosyalar\u0131n belirtilmesi:<\/span><\/strong><\/h2>\n<p>Olu\u015fturma i\u015flemlerinde en \u00e7ok ihtiya\u00e7 duydu\u011fumuz konulardan birisi de &#8220;header&#8221; dosyalar\u0131n\u0131n (C++ da *. h, *. hpp) bulundu\u011fu dizinlere eri\u015fim. Bunun i\u00e7in &#8220;<strong>include_directories()<\/strong>&#8221; komutunu kullan\u0131yoruz. Bunun normal kullan\u0131m\u0131 &#8220;<strong>include_directories( ${MY_SOURCE_DIR}\/include)<\/strong>&#8221; gibidir. E\u011fer buna bir \u00f6ncelik tan\u0131mlamak isterseniz de ayr\u0131ca bir parametre ge\u00e7irerek bunu sa\u011flayabilirsiniz. A\u015fa\u011f\u0131da buna ili\u015fkin de bir kullan\u0131m g\u00f6rebilirsiniz:<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true \">include_directories( BEFORE ${MY_SOURCE_DIR}\/include )<\/pre>\n<p>Bu komut ile ilgili olarak;<\/p>\n<ul>\n<li>G\u00f6receli dizinler mevcut kaynak dizine g\u00f6redir,<\/li>\n<li><strong>BEFORE<\/strong>\/<strong>AFTER<\/strong> parametreleri ile ilgili dizinin, dizin arama listesinde nereye eklenece\u011fi belirtebilirsiniz. Varsay\u0131lan olarak bunlar sona ekleniyor.<\/li>\n<\/ul>\n<p>Daha detayl\u0131 bilgi i\u00e7in a\u015fa\u011f\u0131daki adrese bakabilirsiniz.<\/p>\n<p><a href=\"https:\/\/cmake.org\/cmake\/help\/latest\/command\/include_directories.html\"><span style=\"color: #339966;\"><strong>https:\/\/cmake.org\/cmake\/help\/latest\/command\/include_directories.html<\/strong><\/span><\/a><\/p>\n<h2><strong><span style=\"color: #0000ff;\">Birden fazla dizinden olu\u015fan projeler<\/span><\/strong><\/h2>\n<p>\u00d6ncelikli olarak herhangi bir k\u00fct\u00fcphane kullanmayan ama birden fazla dizinden olu\u015fan bir \u00f6rnek inceleyelim. Bu \u00f6rnekteki dizin yap\u0131s\u0131 a\u015fa\u011f\u0131daki gibi olacak (bu arada bu g\u00f6sterimi komut sat\u0131r\u0131 \u00fczerinden &#8220;<strong>tree<\/strong>&#8221; komutunu kullanarak olu\u015fturabilirsiniz):<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true \">\u2502 CMakeLists.txt\r\n\u251c\u2500\u2500\u2500build\r\n\u251c\u2500\u2500\u2500include\r\n\u2502 Example.h\r\n\u2514\u2500\u2500\u2500src\r\n\u00a0 Example.cpp\r\n\u00a0 main.cpp<\/pre>\n<p>Bu \u00f6rnekte sadece tek bir CMakeLists.txt kullan\u0131yoruz. Bu yap\u0131daki bir projeyi olu\u015fturmak i\u00e7in a\u015fa\u011f\u0131daki gibi bir kod i\u015finizi g\u00f6recektir.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true\">cmake_minimum_required(VERSION 2.8.9)\r\nproject(directory_test)\r\n\r\n# Gerekli ba\u015fl\u0131k dosyalar\u0131n\u0131 ekleyelim (Example.h)\r\ninclude_directories(include)\r\n\r\n# Asagidaki gibi el ile ilgili dosyalar\u0131 ekleyebiliriz:\r\n#set(SOURCES src\/main.cpp src\/Example.cpp)\r\n\r\n# Ya da daha kolay bir \u015fekilde file(GLOB...)komutu ile de bu i\u015fi halledebiliriz:\r\nfile(GLOB SOURCES \"src\/*.cpp\")\r\n\r\nadd_executable(seperateFolderExample ${SOURCES})<\/pre>\n<h2><strong><span style=\"color: #0000ff;\">Alt projelerin eklenmesi<\/span><\/strong><\/h2>\n<p>VS gibi bir \u00e7ok IDE projeleri mant\u0131ksal &#8220;solution&#8221; konteynerleri i\u00e7erisinde bar\u0131nd\u0131rmakta ve geli\u015ftiriciye bunlar\u0131 sunmakta. Fakat CMake de direk bunun kar\u015f\u0131l\u0131\u011f\u0131 bir kavram yok. Bunun yerine bir \u00e7ok proje aras\u0131nda ba\u011f\u0131ml\u0131l\u0131k tan\u0131mlanabiliyor. Bunu CMake ile ba\u015farmak i\u00e7in \u00f6ncelikle olarak VS&#8217;de &#8220;solution&#8221; dedi\u011fimiz tepe proje i\u00e7in en \u00fcst seviyede bir CMakeLists.txt olu\u015fturulur ve bu k\u00f6k dizinde tutulur. Daha sonra eklenecek her ek proje i\u00e7in ayr\u0131 bir dizin a\u00e7\u0131l\u0131p bunlar\u0131n i\u00e7erisinin her birine ilgili projeleri adresleyecek olan CMakeLists.txt dosyalar\u0131 eklenir. Son olarak bu projeler tepe projeye &#8220;<strong>add_subdirectory(dizinIsmi)<\/strong>&#8221; ile eklenir. B\u00fcy\u00fck projeleri bu \u015fekilde grupland\u0131rmak ve organize etmek her zaman idameyi kolayla\u015ft\u0131racakt\u0131r.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">C++ ili\u015fkin baz\u0131 ayarlar<\/span><\/strong><\/h2>\n<p>Daha \u00f6nceki yaz\u0131lar\u0131m\u0131 takip edenler bir s\u00fcredir Modern C++ ile ilgili yaz\u0131lar\u0131m\u0131 g\u00f6rm\u00fc\u015flerdir. Her ne kadar art\u0131k \u00e7o\u011fu C++ derleyicisi modern C++ standartlar\u0131n\u0131 desteklese de, baz\u0131 kullan\u0131c\u0131lar i\u00e7in bu ge\u00e7erli olmayabilir ve bunu kontrol etmekte her zaman fayda vard\u0131r. Diyelim ki C++ 14 uyumlu bir derleyici ihtiyac\u0131n\u0131z var ve bunun ile ilgili ayarlamalar\u0131 derleyiciden ba\u011f\u0131ms\u0131z bir \u015fekilde yapmak istiyorsunuz. \u0130\u015fte bunun i\u00e7in CMake&#8217;in sundu\u011fu \u00f6n tan\u0131ml\u0131 de\u011fi\u015fkenlerini kullanabilirsiniz. Bu durum i\u00e7in bizim kullanaca\u011f\u0131m\u0131z de\u011fi\u015fken ise <strong>CMAKE_CXX_STANDARD<\/strong> de\u011fi\u015fkeni. Bu de\u011fi\u015fken ile asl\u0131nda komut sat\u0131r\u0131ndan &#8220;<strong>-std=c++14<\/strong>&#8221; ge\u00e7irmi\u015f oldu\u011funuzu d\u00fc\u015f\u00fcnebilirsiniz. Bunun i\u00e7in bu de\u011fi\u015fkene ilgili de\u011feri ataman\u0131z yeterli.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true \">cmake_minimum_required(VERSION 3.9.1)\r\nproject(CMakeHello)\r\nset(CMAKE_CXX_STANDARD 14)\r\nadd_executable(cmake_hello main.cpp)<\/pre>\n<p>Bunun ile birlikte derleyiciden derleyiciye de\u011fi\u015fen bir di\u011fer ayar da <strong>CMAKE_CXX_FLAGS<\/strong> \u00f6n tan\u0131ml\u0131 de\u011fi\u015fkenidir. Bunun ile de genel bir \u015fekilde uyar\u0131 seviyelerini ayarlayabilirsiniz. \u00d6rne\u011fin b\u00fct\u00fcn uyar\u0131lar\u0131 g\u00f6rmek i\u00e7in a\u015fa\u011f\u0131daki gibi bir komut kullanabilirsiniz.<\/p>\n<pre class=\"lang:c++ decode:true \">set(CMAKE_CXX_FLAGS \"-Wall\")<\/pre>\n<p>Bu arada birden fazla parametre ayarlamak i\u00e7in de a\u015fa\u011f\u0131daki bir kullan\u0131m\u0131 takip etmeniz \u00f6nceki ayarlar\u0131 da koruman\u0131z i\u00e7in faydal\u0131 olacakt\u0131r:<\/p>\n<pre class=\"lang:c++ decode:true\">set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wall\")<\/pre>\n<p>Burada bu ayar\u0131 yapsan\u0131z bile CMake e\u011fer C++ s\u00fcr\u00fcm\u00fc ile uyumlu bir derleyici bulamaz ise sadece uyar\u0131 verip, en son desteklenen s\u00fcr\u00fcm\u00fc kullan\u0131r. Bunu da \u00f6nlemek i\u00e7in a\u015fa\u011f\u0131daki komutu eklemeniz gerekiyor.<\/p>\n<pre class=\"lang:c++ decode:true \">set(CMAKE_CXX_EXTENSIONS OFF)<\/pre>\n<p>\u00c7o\u011fu olu\u015fturma i\u015fleminiz i\u00e7in yukar\u0131daki mekanizma yeterli olacakt\u0131r. Bu y\u00f6ntemin yan\u0131nda CMake&#8217;in 3.1 s\u00fcr\u00fcm\u00fcnden bu yana sundu\u011fu bir yakla\u015f\u0131m daha var. O da sizin derleyiciden bekledi\u011finiz \u00f6zellikleri belirtmeniz ve bunun ile ilgili kontrolleri CMake b\u0131rakman\u0131z. Bunu &#8220;<strong>target_compile_features()<\/strong>&#8221; komutu ile ger\u00e7ekle\u015ftirebiliyorsunuz. A\u015fa\u011f\u0131da bu komutun genel yap\u0131s\u0131n\u0131 g\u00f6rebilirsiniz:<\/p>\n<pre class=\"\"><code>target_compile_features(&lt;target&gt; &lt;PRIVATE|PUBLIC|INTERFACE&gt; &lt;feature&gt; [...])<\/code><\/pre>\n<p>&#8220;<strong>PRIVATE|PUBLIC|INTERFACE<\/strong>&#8221; parametrelerinin anlam\u0131 \u015fu. E\u011fer &#8220;<strong>PRIVATE<\/strong>&#8221; se\u00e7ili ise; burada belirtilecek olan dil \u00f6zellikleri sadece verilen &#8220;<strong>target<\/strong>&#8221; i\u00e7in kontrol edilir. E\u011fer &#8220;<strong>PUBLIC<\/strong>&#8221; ise bunu kullanan b\u00fct\u00fcn kod par\u00e7alar\u0131 i\u00e7in kontrol edilir ve e\u011fer &#8220;<strong>INTERFACE<\/strong>&#8221; ise sadece buna ba\u011flanan kod par\u00e7alar\u0131 i\u00e7in kontrol edilir kullan\u0131lacak olan. (D\u0131\u015far\u0131dan, daha \u00f6nce var olan hedefler i\u00e7in sadece bu se\u00e7enek kullan\u0131labilir). Tahmin edece\u011finiz \u00fczere &#8220;&#8230;&#8221; k\u0131s\u0131mlar\u0131na ilgili C++ dil \u00f6zelliklerini ekleyebilirsiniz. Kullan\u0131lan CMake taraf\u0131ndan bilinen dil \u00f6zellikleri i\u00e7in ise\u00a0<strong>CMAKE_CXX_KNOWN_FEATURES<\/strong> e bakabilirsiniz.<\/p>\n<pre class=\"lang:c++ decode:true\">message(\"Supported features = ${CMAKE_CXX_COMPILE_FEATURES}\")<\/pre>\n<p>A\u015fa\u011f\u0131da \u00f6rnek baz\u0131 kullan\u0131mlar\u0131 g\u00f6rebilirsiniz:<\/p>\n<pre class=\"lang:c++ decode:true \">\/\/ Ornek 1\r\ntarget_compile_features(myTarget\r\n    PUBLIC\r\n        cxx_variadic_templates\r\n        cxx_nullptr\r\n    PRIVATE\r\n        cxx_lambdas\r\n)\r\n\r\n\/\/ Catch 2 k\u00fct\u00fcphanesinden bir \u00f6rnek dil \u00f6zellikleri ihtiya\u00e7 listesi\r\ntarget_compile_features(Catch2\r\n  INTERFACE\r\n    cxx_alignas\r\n    cxx_alignof\r\n    cxx_attributes\r\n    cxx_auto_type\r\n    cxx_constexpr\r\n    cxx_defaulted_functions\r\n    cxx_deleted_functions\r\n    cxx_final\r\n    cxx_lambdas\r\n    cxx_noexcept\r\n    cxx_override\r\n    cxx_range_for\r\n    cxx_rvalue_references\r\n    cxx_static_assert\r\n    cxx_strong_enums\r\n    cxx_trailing_return_types\r\n    cxx_unicode_literals\r\n    cxx_user_literals\r\n    cxx_variadic_macros\r\n)<\/pre>\n<h2><strong><span style=\"color: #0000ff;\">K\u00fct\u00fcphane olu\u015fturulmas\u0131<\/span><\/strong><\/h2>\n<p>\u015eimdi CMake ile ilgili \u00f6rneklerimizi bir ad\u0131m daha \u00f6teye ta\u015f\u0131yal\u0131m ve k\u00fct\u00fcphaneleri nas\u0131l olu\u015fturabilece\u011fimize bir g\u00f6z atal\u0131m. Bu ama\u00e7la \u00e7ok basit bir matematik k\u00fct\u00fcphanesi tan\u0131mlayaca\u011f\u0131z. Bu \u00f6rnek i\u00e7in kullanaca\u011f\u0131m\u0131z dizin yap\u0131s\u0131 a\u015fa\u011f\u0131daki gibi:<\/p>\n<pre class=\"lang:c++ decode:true\">\u251c\u2500\u2500\u2500build\r\n\u251c\u2500\u2500\u2500lib\r\n\u2502 \u2514\u2500\u2500\u2500math\r\n\u2502 mathLib.cpp\r\n\u2502 mathLib.h\r\n\u2502\r\n\u2514\u2500\u2500\u2500src\r\nmain.cpp<\/pre>\n<p>\u0130lk olarak k\u00fct\u00fcphane kodlar\u0131n\u0131 direk ekleyerek \u00e7al\u0131\u015ft\u0131rabilir kodu \u00fcretebilirsiniz. Bunun i\u00e7in birden fazla dizinin kullan\u0131m\u0131na ili\u015fkin y\u00f6ntemi takip edebilir ve a\u015fa\u011f\u0131daki CMakeLists.txt dosyas\u0131n\u0131 kullanabilirsiniz:<\/p>\n<pre class=\"lang:c++ decode:true \">cmake_minimum_required(VERSION 3.9.1)\r\nproject(mainSimpleLib)\r\nset(CMAKE_CXX_STANDARD 14)\r\nset(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wall\")\r\nset(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}\/bin)\r\nset(SOURCES main.cpp\r\nlib\/math\/mathLib.cpp\r\nlib\/math\/mathLib.hpp)\r\nadd_executable(mainSimpleLib ${SOURCES})<\/pre>\n<p>Ama bizim amac\u0131m\u0131z matematik ile ilgili olan kodlar\u0131 ayr\u0131 bir k\u00fct\u00fcphane olarak olu\u015fturmak ve onlar\u0131 kullanmak. Bu noktada genel olarak takip edilen <em>iki<\/em> y\u00f6ntem var bunlardan ilki: K\u00fct\u00fcphanelere ili\u015fkin olu\u015fturma kodlar\u0131n\u0131n da tepe CMakeLists.txt i\u00e7erisine yerle\u015ftirilmesi ve bunlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131labilir kod ile birlikte olu\u015fturulmas\u0131.<br \/>\nYa da bunlar\u0131n ayr\u0131 olarak her bir k\u00fct\u00fcphane i\u00e7erisine yerle\u015ftirilerek ana CMakeLists.txt i\u00e7erisinden bunun kullan\u0131lmas\u0131. Genel olarak basit uygulamalarda her ne kadar birinci y\u00f6ntem da fazla kabul g\u00f6rse de, ikinci y\u00f6ntem ile k\u00fct\u00fcphanenin olu\u015fturma i\u015flemi ile \u00e7al\u0131\u015ft\u0131r\u0131labilir kod olu\u015fturma i\u015fini birbirinden ay\u0131rabilir, sadece k\u00fct\u00fcphaneleri olu\u015fturabilirsiniz. Ben al\u0131\u015fkanl\u0131k olmas\u0131 a\u00e7\u0131s\u0131ndan ikinci y\u00f6ntemi \u00f6nerece\u011fim keza projelerin b\u00fcy\u00fckl\u00fckleri artt\u0131k\u00e7a ilk y\u00f6ntemi idame ettirmek olduk\u00e7a zorla\u015facakt\u0131r.<\/p>\n<p>\u015eimdi <strong>ilk y\u00f6nteme<\/strong> ili\u015fkin hemen bir \u00f6rnek inceleyelim. \u00d6ncelikli olarak olu\u015fturulacak olan k\u00fct\u00fcphaneleri farkl\u0131 bir dizine koymay\u0131 hedefleyelim. Bunun i\u00e7in \u00f6n tan\u0131ml\u0131 <strong>EXECUTABLE_OUTPUT_PATH\/LIBRARY_OUTPUT_PATH<\/strong> de\u011fi\u015fkenlerini kullanabiliriz. Ayr\u0131ca olu\u015fturaca\u011f\u0131m\u0131z bu k\u00fct\u00fcphaneleri nihai \u00e7al\u0131\u015ft\u0131r\u0131labilir uygulamaya da eklememiz gerekiyor. Bunun i\u00e7in de &#8220;<strong>target_link_libraries()<\/strong>&#8221; komutunu kullanaca\u011f\u0131z. Bu y\u00f6ntem i\u00e7in a\u015fa\u011f\u0131daki CMakeLists.txt&#8217;yi kullanabiliriz.<\/p>\n<p>Bu arada CMake&#8217;in k\u00fct\u00fcphane olu\u015fturmak i\u00e7in kulland\u0131\u011f\u0131 komut &#8220;<strong>add_library()<\/strong>&#8221; komutudur. \u0130lk parametre k\u00fct\u00fcphane ismi ikincisi ise tipi ve di\u011ferleri de dosyalar\u0131 belirtir.<\/p>\n<pre class=\"lang:c++ decode:true \">cmake_minimum_required(VERSION 3.9.1)\r\nproject(seperateLibFirstApproach)\r\n\r\n# C++ standard\u0131n\u0131 atayal\u0131m\r\nset(CMAKE_CXX_STANDARD 14)\r\n\r\n# Baz\u0131 derleyici ayarlar\u0131n\u0131 girelim\r\nset(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -W0\")\r\n\r\n# ilgili include pathi ekleyelim\r\ninclude_directories(lib)\r\n\r\n# \u00c7\u0131kt\u0131 dizinlerini ayarlayal\u0131m\r\nset(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}\/bin)\r\nset(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}\/lib)\r\n\r\n# Bilgilendirme\r\nmessage(${CMAKE_BINARY_DIR})\r\n\r\n# K\u00fct\u00fcphane komutlar\u0131\r\n#add_library(math SHARED lib\/math\/mathLib.h lib\/math\/mathLib.cpp)\r\nadd_library(math STATIC lib\/math\/mathLib.h lib\/math\/mathLib.cpp)\r\n\r\n# \u00c7al\u0131\u015ft\u0131r\u0131labilir uygulama kodu\r\nadd_executable(seperateLibFirstApproach src\/main.cpp)\r\n\r\n# K\u00fct\u00fcphaneleri ba\u011flayal\u0131m\r\ntarget_link_libraries(seperateLibFirstApproach math)<\/pre>\n<p>CMake komutu ile olu\u015fturma i\u015flemini yapt\u0131\u011f\u0131n\u0131zda <em>build\/lib<\/em>\u00a0dizini i\u00e7erisine ilgili k\u00fct\u00fcphane dosyas\u0131n\u0131n olu\u015fturuldu\u011funu g\u00f6receksiniz.<\/p>\n<p>\u015eimdi gelelim <strong>ikinci y\u00f6nteme<\/strong>. Bunun i\u00e7in ilgili k\u00fct\u00fcphane dizini i\u00e7erisine de CMakeLists.txt ekleyece\u011fiz ve mevcut olan\u0131 da biraz de\u011fi\u015ftirece\u011fiz.<br \/>\n\u00d6ncelikle <em>lib\/math<\/em> i\u00e7erisine a\u015fa\u011f\u0131daki gibi bir dosya olu\u015ftural\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true \">cmake_minimum_required(VERSION 3.9.1)\r\n\r\n# \u00c7\u0131kt\u0131 dizinlerini ayarlayal\u0131m\r\nset(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}\/lib)\r\n\r\n# K\u00fct\u00fcphane komutlar\u0131\r\nadd_library(math STATIC mathLib.h mathLib.cpp)<\/pre>\n<p>Tepe dizindeki CMakeLists.txt dosyas\u0131n\u0131 da a\u015fa\u011f\u0131daki gibi g\u00fcncelleyelim:<\/p>\n<pre class=\"lang:c++ decode:true\">cmake_minimum_required(VERSION 3.9.1)\r\nproject(seperateLibSecondApproach)\r\n\r\n# C++ standard\u0131n\u0131 atayal\u0131m\r\nset(CMAKE_CXX_STANDARD 14)\r\n\r\n# Baz\u0131 derleyici ayarlar\u0131n\u0131 girelim\r\nset(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -W0\")\r\n\r\n# ilgili pathi ekleyelim\r\ninclude_directories(lib)\r\n\r\n# \u00c7\u0131kt\u0131 dizinlerini ayarlayal\u0131m\r\nset(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}\/bin)\r\n\r\n# Bilgilendirme\r\nmessage(${CMAKE_BINARY_DIR})\r\n\r\n# K\u00fct\u00fcphaneye ili\u015fkin olu\u015fturma dosyas\u0131na olan ba\u011flant\u0131\r\nadd_subdirectory(lib\/math)\r\n\r\n# \u00c7al\u0131\u015ft\u0131r\u0131labilir uygulama kodu\r\nadd_executable(seperateLibSecondApproach src\/main.cpp)\r\n\r\n# K\u00fct\u00fcphaneleri ba\u011flayal\u0131m\r\ntarget_link_libraries(seperateLibSecondApproach math)<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz \u00fczere asl\u0131nda \u00e7\u0131kt\u0131 anlam\u0131nda bir de\u011fi\u015fiklik olmad\u0131 ama daha d\u00fczenli ve idame edilebilir bir olu\u015fturma yakla\u015f\u0131m\u0131 sa\u011flam\u0131\u015f olduk.<\/p>\n<p>Burada dikkat edilmesi gereken nokta ise \u00f6zellikle payla\u015f\u0131labilir dinamik k\u00fct\u00fcphanelerin kullan\u0131mlar\u0131 (&#8220;<em>Shared Libraries&#8221;<\/em>) her platform i\u00e7in farkl\u0131l\u0131k g\u00f6stermekte. \u00d6rne\u011fin yukar\u0131daki \u00f6rneklerde <strong>STATIC<\/strong> yerine <strong>SHARED<\/strong> se\u00e7ene\u011fini direk se\u00e7ip Windows \u00fczerinde olu\u015fturmay\u0131 deneseydiniz ne yaz\u0131k ki hata ile kar\u015f\u0131la\u015f\u0131rd\u0131n\u0131z. \u00c7\u00fcnk\u00fc VS derleyicisi DLL&#8217;i direk ba\u011flayam\u0131yor (MinGW&#8217;de de s\u0131k\u0131nt\u0131 yok). Bunu kullanabilmek i\u00e7in baz\u0131 noktalara daha de\u011finmemiz gerekecek. \u00d6ncelikli olarak MinGW ile olu\u015fturmu\u015f oldu\u011funuz DLL k\u00fct\u00fcphaneleri b\u00fct\u00fcn sembolleri d\u0131\u015far\u0131ya sunuyorlar. E\u011fer metotlardan herhangi biri <strong>__declspec(dllexport)<\/strong> ile i\u015faretlenmi\u015f ise, bu durumda sadece bunlar d\u0131\u015far\u0131 sunuluyor. VS derleyicisinde ise varsay\u0131lan olarak hi\u00e7 bir sembol d\u0131\u015far\u0131 <span style=\"text-decoration: underline;\">sunulmamakta<\/span>. Bu sebeple VS derleyicisi ile DLL olu\u015fturmak istedi\u011finizde,\u00a0<strong>__declspec(dllexport)<\/strong>\u00a0ifadesini d\u0131\u015far\u0131 sunulmak istenen metotlar \u00f6n\u00fcne eklemeniz gerekiyor.<\/p>\n<p>A\u00e7\u0131k kaynakl\u0131 ve windows platformunu destekleyen yaz\u0131l\u0131mlar\u0131 kullananlar\u0131n\u0131z a\u015fa\u011f\u0131daki tan\u0131mlamalar ile \u00f6yle ya da b\u00f6yle bir noktada kar\u015f\u0131la\u015fm\u0131\u015flard\u0131r.<\/p>\n<pre class=\"lang:c++ decode:true \">#ifndef _SHARED_EXPORTS_H__\r\n#define _SHARED_EXPORTS_H__\r\n\r\n#ifdef _WIN32\r\n  #ifdef SHARED_EXPORTS\r\n     #define SHARED_EXPORT __declspec(dllexport)\r\n   #else\r\n     #define SHARED_EXPORT __declspec(dllimport)\r\n   #endif\r\n#else\r\n   #define SHARED_EXPORT\r\n#endif\r\n\r\n#endif \/* _SHARED_EXPORTS_H__ *\/<\/pre>\n<p>Bunu yapt\u0131\u011f\u0131m\u0131z zaman VS derleyicisi bizim i\u00e7in bir .lib dosyas\u0131 daha olu\u015fturuyorlar, fakat bu normal statik k\u00fct\u00fcphanelerden farkl\u0131 olarak sembol tan\u0131mlamalar\u0131 i\u00e7ermiyor fakat derleme i\u00e7in yeterli tan\u0131mlamalar\u0131 sunuyor. Bu durumda <strong>SHARED_EXPORT<\/strong> tan\u0131mlamas\u0131n\u0131 ilgili s\u0131n\u0131flar\u0131n \u00f6n\u00fcne eklememiz gerekiyor. Hatta VS i\u00e7erisinde .def dosyalar\u0131 haz\u0131rlayabilirsiniz ve bu sayede d\u0131\u015far\u0131ya bu sembolleri sunabilirsiniz. Peki bunu bizim yerimize CMake yapmaz m\u0131 \ud83d\ude42 Elbette yapar.<\/p>\n<p>\u00d6ncelikli olarak <em>lib\/math<\/em>\u00a0dizini i\u00e7erisindeki CMakeLists.txt yi a\u015fa\u011f\u0131daki sat\u0131rlar\u0131 ekleyelim ve <strong>STATIC<\/strong> tan\u0131mlamas\u0131n\u0131 <strong>DYNAMIC<\/strong> ile de\u011fi\u015ftirelim.<\/p>\n<pre class=\"lang:c++ decode:true \">cmake_minimum_required(VERSION 3.9.1)\r\n\r\n# \u00c7\u0131kt\u0131 dizinlerini ayarlayal\u0131m\r\nset(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}\/lib)\r\n\r\n# Sembol tan\u0131mlamalar\u0131 i\u00e7in\r\ninclude (GenerateExportHeader)\r\ninclude_directories(${CMAKE_BINARY_DIR}\/lib\/math)\r\n\r\n# K\u00fct\u00fcphane komutlar\u0131\r\nadd_library(math SHARED mathLib.h mathLib.cpp)\r\n\r\n# generates the export header shared_EXPORTS.h automatically\r\nGENERATE_EXPORT_HEADER(math\r\nBASE_NAME math\r\nEXPORT_MACRO_NAME SHARED_EXPORTS\r\nEXPORT_FILE_NAME SHARED_EXPORTS.h\r\nSTATIC_DEFINE SHARED_EXPORTS_BUILT_AS_STATIC)<\/pre>\n<p>Tepe dizindeki CMakeLists.txt ye de sadece ilgili tan\u0131mlama dosyas\u0131na eri\u015fmek i\u00e7in bir <strong>&#8220;include()&#8221;<\/strong> komutu ekleyece\u011fiz<\/p>\n<pre class=\"lang:c++ decode:true \"># Bu dizini olusturulacak olan dll tanimlamalari icin (sadece DLL olmasi durumu icin gecerli)\r\ninclude_directories(${CMAKE_BINARY_DIR}\/lib\/math)<\/pre>\n<p>Son olarak matematik s\u0131n\u0131f\u0131m\u0131z\u0131 a\u015fa\u011f\u0131daki gibi g\u00fcncelleyelim.<\/p>\n<pre class=\"lang:c++ decode:true \">#ifndef MATHLIB_HPP\r\n#define MATHLIB_HPP\r\n\r\n#include \"Shared_Exports.h\"\r\n\r\nclass SHARED_EXPORTS MathLib\r\n{\r\npublic:\r\nint Sum(const int &amp;a, const int &amp;b);\r\nint Mult(const int &amp;a, const int &amp;b);\r\nint Div(const int &amp;a, const int &amp;b);\r\nint Sub(const int &amp;a, const int &amp;b);\r\n};\r\n\r\n#endif \/\/MATHLIB_HPP<\/pre>\n<p>evet \u015fimdi tekrar <em>build<\/em> dizini i\u00e7erisine girip &#8220;<strong>CMake ..<\/strong>&#8221; komutunu \u00e7a\u011f\u0131rd\u0131\u011f\u0131m\u0131zda. Dinamik k\u00fct\u00fcphanemizi kullanan bir VS olu\u015fturma dosya k\u00fcmesi elde etmi\u015f olaca\u011f\u0131z.<\/p>\n<p>Bu arada DLL ve di\u011fer payla\u015f\u0131ml\u0131 k\u00fct\u00fcphanelerin olu\u015fturulmas\u0131na ili\u015fkin<\/p>\n<p><a href=\"http:\/\/gernotklingler.com\/blog\/creating-using-shared-libraries-different-compilers-different-operating-systems\/\"><strong><span style=\"color: #339966;\">http:\/\/gernotklingler.com\/blog\/creating-using-shared-libraries-different-compilers-different-operating-systems\/<\/span><\/strong><\/a><\/p>\n<p>de \u00e7ok g\u00fczel bir anlat\u0131m var, ona da bakabilirsiniz.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">Opsiyonlar<\/span><\/strong><\/h2>\n<p>\u015eimdi do\u011fal olarak akl\u0131n\u0131za &#8220;yav her seferinde statik veya payla\u015f\u0131ml\u0131 k\u00fct\u00fcphane se\u00e7imini CMakeLists.txt \u00fczerinden yapmasak olmaz m\u0131?&#8221; sorular\u0131n\u0131n geldi\u011fini duyar oluyorum \ud83d\ude42 Ya da bu CMake i\u00e7erisine kendimize ili\u015fkin opsiyonlar ve benzeri mekanizmalar ekleyemez miyiz diye soruyor olabilirsiniz. Elbette ekleyebilirsiniz. Bir \u00f6nceki \u00f6rne\u011fimizden devam edecek olursak. Statik veya dinamik k\u00fct\u00fcphane olu\u015fturma i\u015fini bir opsiyona ba\u011flay\u0131p bunu da ya CMake-GUI veya komut sat\u0131r\u0131ndan vermek istedi\u011fimiz d\u00fc\u015f\u00fcnelim. Bunun i\u00e7in &#8220;<strong>option()<\/strong>&#8220;komutunu kullanabilirsiniz. K\u0131saca bu komut:<\/p>\n<pre class=\"lang:c++ decode:true \">option(&lt;option_variable&gt; \"help string describing option\" [initial value])<\/pre>\n<p>\u015feklinde. Yani ilk parametre bizim opsiyona verdi\u011fimiz isim, ikincisi onun a\u00e7\u0131klamas\u0131 ve \u00fc\u00e7\u00fcnc\u00fcs\u00fc de ilk de\u011feri ki bu ya <strong>ON<\/strong> ya da <strong>OFF<\/strong> oluyor. Varsay\u0131lan de\u011fer <strong>OFF<\/strong>.<\/p>\n<p>Bu ba\u011flamda ilgili CMake dosyalar\u0131m\u0131z a\u015fa\u011f\u0131daki gibi de\u011fi\u015fiyor:<\/p>\n<p>Tepe dosyam\u0131z:<\/p>\n<pre class=\"lang:c++ decode:true \">cmake_minimum_required(VERSION 3.9.1)\r\nproject(seperateLibSecondApproach)\r\n\r\n# C++ standard\u0131n\u0131 atayal\u0131m\r\nset(CMAKE_CXX_STANDARD 14)\r\n\r\n# Burada DLL ya da lib olusturmak icin bir opsiyon ekliyoruz\r\noption(OPTIONS_SHARED_LIBRARY_ENABLED \"Shared library generation\" ON)\r\n\r\n# Baz\u0131 derleyici ayarlar\u0131n\u0131 girelim\r\nset(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -W0\")\r\n\r\n# ilgili pathi ekleyelim\r\ninclude_directories(lib)\r\n\r\nif (OPTIONS_SHARED_LIBRARY_ENABLED)\r\n# Bu dizini olusturulacak olan dll tanimlamalari icin (sadece DLL olmasi durumu icin gecerli)\r\ninclude_directories(${CMAKE_BINARY_DIR}\/lib\/math)\r\nendif(OPTIONS_SHARED_LIBRARY_ENABLED)\r\n\r\n# \u00c7\u0131kt\u0131 dizinlerini ayarlayal\u0131m\r\nset(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}\/bin)\r\n\r\n# Bilgilendirme\r\nmessage(${CMAKE_BINARY_DIR})\r\n\r\n# K\u00fct\u00fcphaneye ili\u015fkin olu\u015fturma dosyas\u0131na olan ba\u011flant\u0131\r\nadd_subdirectory(lib\/math)\r\n\r\n# \u00c7al\u0131\u015ft\u0131r\u0131labilir uygulama kodu\r\nadd_executable(seperateLibSecondApproach src\/main.cpp)\r\n\r\n# K\u00fct\u00fcphaneleri ba\u011flayal\u0131m\r\ntarget_link_libraries(seperateLibSecondApproach math)<\/pre>\n<p>K\u00fct\u00fcphane dosyam\u0131z da:<\/p>\n<pre class=\"lang:c++ decode:true\">cmake_minimum_required(VERSION 3.9.1)\r\n\r\n# \u00c7\u0131kt\u0131 dizinlerini ayarlayal\u0131m\r\nset(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}\/lib)\r\n\r\nif (OPTIONS_SHARED_LIBRARY_ENABLED)\r\ninclude (GenerateExportHeader)\r\ninclude_directories(${CMAKE_BINARY_DIR}\/lib\/math)\r\nendif (OPTIONS_SHARED_LIBRARY_ENABLED)\r\n\r\n# K\u00fct\u00fcphane komutlar\u0131\r\nif (OPTIONS_SHARED_LIBRARY_ENABLED)\r\nadd_library(math SHARED mathLib.h mathLib.cpp)\r\nelse()\r\nadd_library(math STATIC mathLib.h mathLib.cpp)\r\nendif (OPTIONS_SHARED_LIBRARY_ENABLED)\r\n\r\nif (OPTIONS_SHARED_LIBRARY_ENABLED)\r\nGENERATE_EXPORT_HEADER(math # generates the export header shared_EXPORTS.h automatically\r\nBASE_NAME math\r\nEXPORT_MACRO_NAME SHARED_EXPORTS\r\nEXPORT_FILE_NAME SHARED_EXPORTS.h\r\nSTATIC_DEFINE SHARED_EXPORTS_BUILT_AS_STATIC)\r\nendif (OPTIONS_SHARED_LIBRARY_ENABLED)<\/pre>\n<p>\u015fekline d\u00f6n\u00fc\u015f\u00fcyor. Opsiyonlara ili\u015fkin detaylar i\u00e7in<\/p>\n<p><strong><span style=\"color: #339966;\"> https:\/\/cmake.org\/cmake\/help\/latest\/command\/option.html?highlight=i <\/span><\/strong><\/p>\n<p>sayfas\u0131na bir g\u00f6z atabilirsiniz.<\/p>\n<p>Son olarak burada \u00f6rnek verdi\u011fim ve \u00f6rnekler i\u00e7in a\u015fa\u011f\u0131daki ambara bir g\u00f6z atabilirsiniz:<\/p>\n<p><span style=\"color: #339966;\"><strong><a style=\"color: #339966;\" href=\"https:\/\/github.com\/yazilimperver\/CMake-Files\">https:\/\/github.com\/yazilimperver\/CMake-Files<\/a><\/strong><\/span><\/p>\n<p>Ayr\u0131ca a\u015fa\u011f\u0131daki sayfada da olduk\u00e7a \u00e7e\u015fitli \u00f6rnek kod ve kullan\u0131m var:<\/p>\n<p><strong><span style=\"color: #339966;\"><a style=\"color: #339966;\" href=\"https:\/\/github.com\/onqtam\/awesome-cmake\">https:\/\/github.com\/onqtam\/awesome-cmake<\/a><\/span><\/strong><\/p>\n<h2><strong><span style=\"color: #0000ff;\">Kaynaklar<\/span><\/strong><\/h2>\n<p><span style=\"color: #339966;\"><strong><a style=\"color: #339966;\" href=\"https:\/\/medium.com\/@onur.dundar1\/cmake-tutorial-585dd180109b\">https:\/\/medium.com\/@onur.dundar1\/cmake-tutorial-585dd180109b<\/a><\/strong><\/span><\/p>\n<p><span style=\"color: #339966;\"><strong><a style=\"color: #339966;\" href=\"https:\/\/www.wikiwand.com\/en\/CMake#\/Applications_that_use_CMake\">https:\/\/www.wikiwand.com\/en\/CMake#\/Applications_that_use_CMake<\/a><\/strong><\/span><\/p>\n<p><span style=\"color: #339966;\"><strong><a style=\"color: #339966;\" href=\"https:\/\/crascit.com\/2015\/03\/28\/enabling-cxx11-in-cmake\">https:\/\/crascit.com\/2015\/03\/28\/enabling-cxx11-in-cmake<\/a>\/<\/strong><\/span><\/p>\n<p><span style=\"color: #339966;\"><strong><a style=\"color: #339966;\" href=\"https:\/\/yazilimcorbasi.blogspot.com\/2015\/04\/cmake.html\">https:\/\/yazilimcorbasi.blogspot.com\/2015\/04\/cmake.html<\/a><\/strong><\/span><\/p>\n<p><span style=\"color: #339966;\"><strong><a style=\"color: #339966;\" href=\"http:\/\/gernotklingler.com\/blog\/creating-using-shared-libraries-different-compilers-different-operating-systems\/\">http:\/\/gernotklingler.com\/blog\/creating-using-shared-libraries-different-compilers-different-operating-systems\/<\/a><\/strong><\/span><\/p>\n<p><span style=\"color: #339966;\"><strong><a style=\"color: #339966;\" href=\"https:\/\/cmake.org\/cmake\/help\/v3.0\/module\/GenerateExportHeader.html\">https:\/\/cmake.org\/cmake\/help\/v3.0\/module\/GenerateExportHeader.html<\/a><\/strong><\/span><\/p>\n<p><span style=\"color: #339966;\"><strong><a style=\"color: #339966;\" href=\"https:\/\/cmake.org\/cmake\/help\/latest\/command\/option.html?highlight=i\">https:\/\/cmake.org\/cmake\/help\/latest\/command\/option.html?highlight=i<\/a><\/strong><\/span><\/p>\n<p><span style=\"color: #339966;\"><strong><a style=\"color: #339966;\" href=\"https:\/\/www.jetbrains.com\/help\/clion\/quick-cmake-tutorial.html\">https:\/\/www.jetbrains.com\/help\/clion\/quick-cmake-tutorial.html<\/a><\/strong><\/span><\/p>\n<p><strong><span style=\"color: #339966;\"><a style=\"color: #339966;\" href=\"http:\/\/preshing.com\/20170522\/learn-cmakes-scripting-language-in-15-minutes\/\">http:\/\/preshing.com\/20170522\/learn-cmakes-scripting-language-in-15-minutes\/<\/a><\/span><\/strong><\/p>","protected":false},"excerpt":{"rendered":"<p>Evet arkada\u015flar CMake ile ilgili ikinci yaz\u0131m\u0131za ho\u015f geldiniz. \u0130lk yaz\u0131 i\u00e7in a\u015fa\u011f\u0131daki linki takip edebilirsiniz: Merhaba CMake Bu yaz\u0131mda CMake ile ilgili di\u011fer kabiliyetlere de\u011finip daha fazla \u00f6rnekleri inceleyece\u011fiz. \u015eunu belirtmem gerekiyor ki her konuda oldu\u011fu gibi CMake&#8217;i de en iyi \u00f6\u011frenme \u015fekillerinden biri kendi ki\u015fisel veya di\u011fer projelerinizde bunu kullanmak ve di\u011fer \u00f6rnek&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":467,"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":[27,11],"tags":[156,155,159,63,158,157,58],"class_list":["post-494","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arac","category-visual-studio","tag-build","tag-cmake","tag-cmake-gui","tag-cross-platform","tag-makefile","tag-platform-independent-build","tag-visual-studio"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>CMake - II (devam) - 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\/2018\/09\/13\/cmake-devam\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[:tr]CMake - II (devam)[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Evet arkada\u015flar CMake ile ilgili ikinci yaz\u0131m\u0131za ho\u015f geldiniz. \u0130lk yaz\u0131 i\u00e7in a\u015fa\u011f\u0131daki linki takip edebilirsiniz: Merhaba CMake Bu yaz\u0131mda CMake ile ilgili di\u011fer kabiliyetlere de\u011finip daha fazla \u00f6rnekleri inceleyece\u011fiz. \u015eunu belirtmem gerekiyor ki her konuda oldu\u011fu gibi CMake&#8217;i de en iyi \u00f6\u011frenme \u015fekillerinden biri kendi ki\u015fisel veya di\u011fer projelerinizde bunu kullanmak ve di\u011fer \u00f6rnek... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2018-09-13T11:43:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-09-13T17:34:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/08\/CmakeLogo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"225\" \/>\n\t<meta property=\"og:image:height\" content=\"225\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\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=\"15 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\/2018\/09\/13\/cmake-devam\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"CMake &#8211; II (devam)\",\"datePublished\":\"2018-09-13T11:43:00+00:00\",\"dateModified\":\"2018-09-13T17:34:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/\"},\"wordCount\":2128,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"build\",\"CMAKE\",\"cmake gui\",\"Cross Platform\",\"makefile\",\"platform independent build\",\"Visual Studio\"],\"articleSection\":[\"Ara\u00e7\",\"Visual Studio\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/\",\"name\":\"[:tr]CMake - II (devam)[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2018-09-13T11:43:00+00:00\",\"dateModified\":\"2018-09-13T17:34:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"CMake &#8211; II (devam)\"}]},{\"@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":"[:tr]CMake - II (devam)[:] - 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\/2018\/09\/13\/cmake-devam\/","og_locale":"tr_TR","og_type":"article","og_title":"[:tr]CMake - II (devam)[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Evet arkada\u015flar CMake ile ilgili ikinci yaz\u0131m\u0131za ho\u015f geldiniz. \u0130lk yaz\u0131 i\u00e7in a\u015fa\u011f\u0131daki linki takip edebilirsiniz: Merhaba CMake Bu yaz\u0131mda CMake ile ilgili di\u011fer kabiliyetlere de\u011finip daha fazla \u00f6rnekleri inceleyece\u011fiz. \u015eunu belirtmem gerekiyor ki her konuda oldu\u011fu gibi CMake&#8217;i de en iyi \u00f6\u011frenme \u015fekillerinden biri kendi ki\u015fisel veya di\u011fer projelerinizde bunu kullanmak ve di\u011fer \u00f6rnek... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2018-09-13T11:43:00+00:00","article_modified_time":"2018-09-13T17:34:46+00:00","og_image":[{"width":225,"height":225,"url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/08\/CmakeLogo.jpg","type":"image\/jpeg"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"15 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"CMake &#8211; II (devam)","datePublished":"2018-09-13T11:43:00+00:00","dateModified":"2018-09-13T17:34:46+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/"},"wordCount":2128,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["build","CMAKE","cmake gui","Cross Platform","makefile","platform independent build","Visual Studio"],"articleSection":["Ara\u00e7","Visual Studio"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/","name":"[:tr]CMake - II (devam)[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2018-09-13T11:43:00+00:00","dateModified":"2018-09-13T17:34:46+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/09\/13\/cmake-devam\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"CMake &#8211; II (devam)"}]},{"@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\/494","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=494"}],"version-history":[{"count":11,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/494\/revisions"}],"predecessor-version":[{"id":509,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/494\/revisions\/509"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media\/467"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=494"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=494"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=494"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}