cmake ट्यूटोरियल
Cmake के साथ शुरुआत करना
खोज…
टिप्पणियों
CMake मुख्य रूप से C ++ के लिए कोड बनाता है, को परिभाषित करने और प्रबंधित करने का एक उपकरण है।
CMake एक क्रॉस-प्लेटफ़ॉर्म टूल है; इस विचार की एक एकल परिभाषा है कि परियोजना का निर्माण कैसे किया जाता है - जो किसी भी समर्थित मंच के लिए विशिष्ट निर्माण परिभाषाओं में अनुवाद करता है।
यह विभिन्न प्लेटफ़ॉर्म-विशिष्ट बिल्ड सिस्टम के साथ जोड़कर इसे पूरा करता है; CMake एक मध्यवर्ती कदम है, जो विभिन्न विशिष्ट प्लेटफार्मों के लिए इनपुट इनपुट बनाता है। लिनक्स पर, CMake मेकफाइल्स उत्पन्न करता है; विंडोज पर, यह विज़ुअल स्टूडियो प्रोजेक्ट्स, और इसी तरह उत्पन्न कर सकता है।
निर्माण व्यवहार CMakeLists.txt
फ़ाइलों में परिभाषित किया CMakeLists.txt
है - स्रोत कोड की प्रत्येक निर्देशिका में एक। प्रत्येक निर्देशिका के CMakeLists
फ़ाइल को परिभाषित करता है कि बिल्डडेसिस्ट को उस विशिष्ट निर्देशिका में क्या करना चाहिए। यह यह भी परिभाषित करता है कि सीएमके को कौन सी उपनिर्देशिकाएं संभालनी चाहिए।
विशिष्ट कार्यों में शामिल हैं:
- इस निर्देशिका में कुछ स्रोत फ़ाइलों में से एक पुस्तकालय या एक निष्पादन योग्य बनाएँ।
- बिल्ड के दौरान उपयोग किए गए पथ में एक फ़ाइलपथ जोड़ें।
- वैरिएबल को परिभाषित करें जिसका निर्माण इस निर्देशिका में और इसके उपनिर्देशिकाओं में करेगा।
- विशिष्ट बिल्ड कॉन्फ़िगरेशन के आधार पर, एक फ़ाइल बनाएं।
- लाइब्रेरी का पता लगाएँ, जो स्रोत के पेड़ में कहीं है।
अंतिम CMakeLists
फाइलें बहुत स्पष्ट और सीधी हो सकती हैं, क्योंकि प्रत्येक गुंजाइश में सीमित है। प्रत्येक केवल उसी निर्माण को संभालता है जो वर्तमान निर्देशिका में मौजूद है।
CMake पर आधिकारिक संसाधनों के लिए, CMake के दस्तावेज़ और ट्यूटोरियल देखें ।
संस्करण
संस्करण | रिलीज़ की तारीख |
---|---|
3.9 | 2017/07/18 |
3.8 | 2017/04/10 |
3.7 | 2016/11/11 |
3.6 | 2016/07/07 |
3.5 | 2016/03/08 |
3.4 | 2015/11/12 |
3.3 | 2015/07/23 |
3.2 | 2015-03-10 |
3.1 | 2014-12-17 |
3.0 | 2014-06-10 |
2.8.12.1 | 2013-11-08 |
2.8.12 | 2013-10-11 |
2.8.11 | 2013-05-16 |
2.8.10.2 | 2012-11-27 |
2.8.10.1 | 2012-11-07 |
2.8.10 | 2012-10-31 |
2.8.9 | 2012-08-09 |
2.8.8 | 2012-04-18 |
2.8.7 | 2011-12-30 |
2.8.6 | 2011-12-30 |
2.8.5 | 2011-07-08 |
2.8.4 | 2011-02-16 |
2.8.3 | 2010-11-03 |
2.8.2 | 2010-06-28 |
2.8.1 | 2010-03-17 |
2.8 | 2009-11-13 |
2.6 | 2008-05-05 |
CMake स्थापना
सीएमके डाउनलोड पृष्ठ पर जाएं और अपने ऑपरेटिंग सिस्टम, जैसे विंडोज, लिनक्स, या मैक ओएस एक्स के लिए एक बाइनरी प्राप्त करें। विंडोज पर डबल बाइनरी स्थापित करने के लिए क्लिक करें। लिनक्स पर बाइनरी को टर्मिनल से चलाते हैं।
लिनक्स पर, आप वितरण के पैकेज प्रबंधक से संकुल भी स्थापित कर सकते हैं। Ubuntu 16.04 पर आप कमांड-लाइन और ग्राफिकल एप्लिकेशन को इनस्टॉल कर सकते हैं:
sudo apt-get install cmake
sudo apt-get install cmake-gui
FreeBSD पर आप कमांड-लाइन और Qt- आधारित ग्राफ़िकल एप्लिकेशन को इनस्टॉल कर सकते हैं:
pkg install cmake
pkg install cmake-gui
मैक ओएसएक्स पर, यदि आप अपने सॉफ़्टवेयर को स्थापित करने के लिए उपलब्ध पैकेज प्रबंधकों में से एक का उपयोग करते हैं, तो सबसे उल्लेखनीय मैकप्रॉर्ट्स ( मैकपोर्ट्स ) और होमब्रे ( होमब्रे ), आप उनमें से एक के माध्यम से सीएमके भी स्थापित कर सकते हैं। उदाहरण के लिए, MacPorts के मामले में, निम्न टाइप करना
sudo port install cmake
CMake स्थापित करेगा, जबकि यदि आप Homebrew पैकेज का उपयोग करते हैं तो आप टाइप करेंगे
brew install cmake
एक बार जब आप CMake स्थापित कर लेते हैं, तो आप निम्न कार्य करके आसानी से जांच कर सकते हैं
cmake --version
आपको निम्नलिखित के समान कुछ देखना चाहिए
cmake version 3.5.1
CMake suite maintained and supported by Kitware (kitware.com/cmake).
बिल्ड प्रकार, जैसे डिबग और रिलीज़ के बीच स्विच करना
CMake कई बिल्ड प्रकारों को जानता है, जो आमतौर पर डिफ़ॉल्ट कंपाइलर और लिंकर मापदंडों (जैसे कि डिबगिंग जानकारी बनाई जा रही है) या वैकल्पिक कोड पथ को प्रभावित करते हैं।
डिफ़ॉल्ट रूप से, CMake निम्नलिखित बिल्ड प्रकारों को संभालने में सक्षम है:
- डीबग : आमतौर पर क्लासिक डीबग बिल्ड जिसमें डीबगिंग जानकारी, कोई ऑप्टिमाइज़ेशन आदि शामिल नहीं है
- रिलीज़ : आपका कोई भी डिबगिंग जानकारी और पूर्ण अनुकूलन के साथ विशिष्ट रिलीज़ बिल्ड।
- RelWithDebInfo:: रिलीज के रूप में भी, लेकिन डिबगिंग जानकारी के साथ।
- MinSizeRel : आकार के लिए अनुकूलित एक विशेष रिलीज़ बिल्ड।
विन्यास कैसे संभाला जाता है यह उस जनरेटर पर निर्भर करता है जिसका उपयोग किया जा रहा है।
कुछ जनरेटर (जैसे विजुअल स्टूडियो) कई कॉन्फ़िगरेशन का समर्थन करते हैं। CMake एक ही बार में सभी कॉन्फ़िगरेशन उत्पन्न करेगा और आप IDE से या --config CONFIG
( cmake --build
साथ) का उपयोग करके चुन सकते हैं कि आप कौन सा कॉन्फ़िगरेशन बनाना चाहते हैं। इन जनरेटरों के लिए CMake एक बिल्ड डायरेक्टरी स्ट्रक्चर तैयार करने की पूरी कोशिश करेगा, ताकि अलग-अलग कॉन्फ़िगरेशन की फाइलें एक-दूसरे पर कदम न रखें।
जनरेटर जो केवल एकल कॉन्फ़िगरेशन का समर्थन करते हैं (जैसे यूनिक्स मेकफाइल्स) अलग तरीके से काम करते हैं। यहां वर्तमान में सक्रिय कॉन्फ़िगरेशन CMake चर CMAKE_BUILD_TYPE
के मान से निर्धारित CMAKE_BUILD_TYPE
।
उदाहरण के लिए, एक अलग बिल्ड टाइप चुनने के लिए निम्नलिखित कमांड लाइन कमांड जारी कर सकता है:
cmake -DCMAKE_BUILD_TYPE=Debug path/to/source
cmake -DCMAKE_BUILD_TYPE=Release path/to/source
एक CMake स्क्रिप्ट को CMAKE_BUILD_TYPE
खुद सेट करने से बचना चाहिए, क्योंकि यह आमतौर पर उपयोगकर्ताओं को ऐसा करने की ज़िम्मेदारी माना जाता है।
एकल-कॉन्फ़िगरेशन जनरेटर के लिए कॉन्फ़िगरेशन स्विच करने के लिए सीएमके को फिर से चलाना आवश्यक है। एक बाद के निर्माण के लिए पहले कॉन्फ़िगरेशन द्वारा उत्पादित ऑब्जेक्ट फ़ाइलों को अधिलेखित करने की संभावना है।
सरल "हैलो वर्ल्ड" प्रोजेक्ट
एक सी ++ स्रोत फ़ाइल को देखते हुए main.cpp
एक निर्णायक main()
समारोह, एक साथ CMakeLists.txt
फ़ाइल (निम्नलिखित सामग्री के साथ) CMake हिदायत मौजूदा प्रणाली के लिए उपयुक्त बनाने के निर्देश पैदा करते हैं और डिफ़ॉल्ट C ++ कम्पाइलर करने के लिए होगा।
main.cpp ( C ++ हैलो वर्ल्ड उदाहरण )
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.4)
project(hello_world)
add_executable(app main.cpp)
cmake_minimum_required(VERSION 2.4)
वर्तमान स्क्रिप्ट का मूल्यांकन करने के लिए आवश्यक न्यूनतमcmake_minimum_required(VERSION 2.4)
निर्धारित करता है।project(hello_world)
एक नया CMake प्रोजेक्ट शुरू करता है। यह बहुत सारे आंतरिक सीएमके तर्क को ट्रिगर करेगा, विशेष रूप से डिफ़ॉल्ट सी और सी ++ कंपाइलर का पता लगाना।साथ
add_executable(app main.cpp)
निर्माण लक्ष्यapp
बनाई गई है, जो वर्तमान सेटिंग के लिए कुछ डिफ़ॉल्ट झंडे के साथ विन्यस्त संकलक आह्वान एक निष्पादन संकलित करने के लिए होगाapp
दिए गए स्रोत फ़ाइल सेmain.cpp
।
कमांड लाइन (इन-सोर्स-बिल्ड, अनुशंसित नहीं)
> cmake .
...
> cmake --build .
cmake .
कंपाइलर डिटेक्शन करता है, दिए गए CMakeLists.txt
मूल्यांकन करता है .
निर्देशिका और वर्तमान कार्यशील निर्देशिका में निर्मित वातावरण बनाता है।
cmake --build .
आदेश आवश्यक निर्माण / कॉल करने के लिए एक अमूर्त है।
कमांड लाइन (आउट-ऑफ-सोर्स, अनुशंसित)
किसी भी निर्माण कलाकृतियों से अपने स्रोत कोड को साफ रखने के लिए आपको "आउट-ऑफ-सोर्स" बिल्ड करना चाहिए।
> mkdir build
> cd build
> cmake ..
> cmake --build .
या सीएमके ऊपर के उदाहरण से आपके प्लेटफार्मों के मूल आदेशों को भी सार कर सकते हैं:
> cmake -E make_directory build
> cmake -E chdir build cmake ..
> cmake --build build
"हैलो वर्ल्ड" कई स्रोत फ़ाइलों के साथ
पहले हम शीर्ष लेख फ़ाइलों की निर्देशिकाओं को include_directories()
द्वारा निर्दिष्ट कर सकते हैं include_directories()
, फिर हमें add_executable()
द्वारा निष्पादन योग्य लक्ष्य की संगत स्रोत फ़ाइलों को निर्दिष्ट करने की आवश्यकता है, और सुनिश्चित करें कि स्रोत फ़ाइलों में एक main()
फ़ंक्शन है।
निम्नलिखित एक सरल उदाहरण है, सभी फ़ाइलों को PROJECT_SOURCE_DIR
निर्देशिका में रखा गया है।
main.cpp
#include "foo.h"
int main()
{
foo();
return 0;
}
foo.h
void foo();
foo.cpp
#include <iostream>
#include "foo.h"
void foo()
{
std::cout << "Hello World!\n";
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.4)
project(hello_world)
include_directories(${PROJECT_SOURCE_DIR})
add_executable(app main.cpp foo.cpp) # be sure there's exactly one main() function in the source files
हम अपनी परियोजना के निर्माण के लिए उपरोक्त उदाहरण में उसी प्रक्रिया का पालन कर सकते हैं। फिर एक्जीक्यूटिंग app
प्रिंट होगा
>./app
Hello World!
एक पुस्तकालय के रूप में "हैलो वर्ल्ड"
यह उदाहरण दिखाता है कि "हैलो वर्ल्ड" कार्यक्रम को एक पुस्तकालय के रूप में कैसे तैनात किया जाए और इसे अन्य लक्ष्यों के साथ कैसे जोड़ा जाए।
मान लें कि हमारे पास http://www.riptutorial.com/cmake/example/22391/-hello-world--with-multiple-source-files उदाहरण के समान स्रोत / हेडर फाइलें हैं। इसके बजाय कई स्रोत फ़ाइलों से निर्माण की, हम पहले तैनात कर सकते हैं foo.cpp
का उपयोग करके एक पुस्तकालय के रूप में add_library()
और बाद में साथ मुख्य कार्यक्रम के साथ यह जोड़ने target_link_libraries()
।
हम CMakeLists.txt को संशोधित करते हैं
cmake_minimum_required(VERSION 2.4)
project(hello_world)
include_directories(${PROJECT_SOURCE_DIR})
add_library(applib foo.cpp)
add_executable(app main.cpp)
target_link_libraries(app applib)
और उसी चरणों का पालन करते हुए, हम एक ही परिणाम प्राप्त करेंगे।