CMake target_include_directories गुंजाइश का अर्थ है


जवाबों:


125

ये कीवर्ड्स बताने के लिए उपयोग किया जाता है जब की सूची निर्देशिका आप लक्षित करने के लिए गुजर रहे हैं की जरूरत है शामिल हैं। जब तक , इसका मतलब है कि अगर उन निर्देशिकाओं को शामिल करना आवश्यक है:

  • उस लक्ष्य को संकलित करने के लिए।
  • अन्य लक्ष्यों को संकलित करने के लिए जो उस लक्ष्य पर निर्भर होते हैं (जैसे कि इसके सार्वजनिक शीर्षकों का उपयोग करना)।
  • उपरोक्त दोनों स्थितियों में।

जब CMake लक्ष्य संकलन है, यह लक्ष्य का उपयोग करता है INCLUDE_DIRECTORIES, COMPILE_DEFINITIONSऔर COMPILE_OPTIONSगुण। जब आप PRIVATEकीवर्ड का उपयोग एक target_include_directories()जैसे करते हैं और आप सीएमके को उन लक्षित गुणों को आबाद करने के लिए कहते हैं।

जब सीएमके एक लक्ष्य ए और दूसरे लक्ष्य बी (जैसे जब आप target_link_libraries(A B)कमांड का उपयोग करते हैं ) के बीच एक निर्भरता का पता लगाता है , तो यह लक्ष्य के लिए B उपयोग की आवश्यकताओं को संचरित करता है A। उन लक्ष्य उपयोग आवश्यकताओं में शामिल निर्देशिकाएं, संकलन परिभाषाएं आदि शामिल हैं, जो किसी भी लक्ष्य Bको पूरा करती हैं जो मिलना चाहिए। वे INTERFACE_*ऊपर सूचीबद्ध गुणों (जैसे INTERFACE_INCLUDE_DIRECTORIES) के संस्करण द्वारा निर्दिष्ट किए जाते हैं , और कमांड को INTERFACEकॉल करते समय कीवर्ड का उपयोग करके पॉपुलेटेड होते हैं target_*()

PUBLICकीवर्ड मोटे तौर पर इसका मतलब है PRIVATE + INTERFACE

इसलिए, मान लीजिए कि आप एक पुस्तकालय बना रहे हैं Aजो कुछ बूस्टर हेडर का उपयोग करता है। तुम करोगे:

  • target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})यदि आप केवल अपने स्रोत फ़ाइलों ( .cpp) या निजी हेडर फ़ाइलों ( .h) के अंदर उन बूस्टर हेडर का उपयोग करते हैं ।
  • target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})यदि आप अपने स्रोत फ़ाइलों के अंदर उन बूस्टर हेडर का उपयोग नहीं करते हैं (इसलिए, उन्हें संकलित करने की आवश्यकता नहीं है A)। मैं वास्तव में इसके लिए एक वास्तविक दुनिया उदाहरण के बारे में नहीं सोच सकता।
  • target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})यदि आप अपनी सार्वजनिक हेडर फ़ाइलों में उन बूस्टर हेडर का उपयोग करते हैं, जो किसी Aस्रोत फ़ाइल में BOTH शामिल हैं और आपकी Aलाइब्रेरी के किसी अन्य क्लाइंट में भी शामिल हो सकते हैं ।

CMake 3.0 प्रलेखन में इस बिल्ड विनिर्देश और उपयोग आवश्यकताओं के गुणों के बारे में अधिक जानकारी है ।


18
एक वास्तविक दुनिया के उदाहरण के संबंध में INTERFACEtarget_include_directories(libname INTERFACE include PRIVATE include/libname)। इसका मतलब है कि आपकी लाइब्रेरी के भीतर आप सीधे फाइलें शामिल कर सकते हैं, लेकिन लाइब्रेरी के उपयोगकर्ता के रूप में आपको libname/पहले सम्मिलित करना होगा ।
करेज १०

2
यह उत्तर मुझे पुस्तकालय बनाने के लिए समझ में आता है। लेकिन एक निष्पादन योग्य लक्ष्य के लिए target_include_directories को कॉल करने के बारे में कैसे?
नॉर्मन पेलेट

1
@NormanPellet: आप target_include_directories()निष्पादन योग्य लक्ष्य के लिए कॉल कर सकते हैं , यदि आपको उन निर्देशिकाओं को सेट करने की आवश्यकता होती है, जिसमें उन हेडर फ़ाइलों का उपयोग किया जाता है, जिन्हें खोजने के लिए हेडर फाइल का उपयोग किया जाना है (उदाहरण के लिए: Boost :: Program_options, यदि आप इसका उपयोग अपने main()कार्य में तर्क के लिए करते हैं) । आप शायद PRIVATEइस मामले में कीवर्ड का उपयोग करेंगे, क्योंकि निष्पादन योग्य को संकलित करने के लिए इन फ़ाइलों की आवश्यकता होती है। मुझे नहीं पता कि वहाँ के लिए INTERFACEया PUBLICएक निष्पादन योग्य पर कुछ उपयोग है , हालांकि।
तमनहंते

13

निम्नलिखित तर्कों के दायरे को निर्दिष्ट करने के लिए आंतरिक, सार्वजनिक और निजी कीवर्ड आवश्यक हैं। निजी और सार्वजनिक आइटम INCLUDE_DIRECTORIES <लक्ष्य> की संपत्ति को आबाद करेंगे। सार्वजनिक और आंतरिक आइटम INTERFACE_INCLUDE_DIRECTORIES <लक्ष्य> की संपत्ति को आबाद करेंगे। निम्नलिखित तर्कों में निर्देशिकाएं शामिल हैं।

प्रलेखन से: http://www.cmake.org/cmake/help/v3.0/command/target_include_direct.html

अपने स्वयं के शब्दों के साथ प्रलेखन को फिर से लिखना:

  • आप लक्ष्य के लिए निर्देशिका को शामिल करने की सूची में एक निर्देशिका जोड़ना चाहते हैं
  • PRIVATE के साथ डायरेक्टरी को टारगेट में शामिल डाइरेक्टरीज़ में जोड़ा जाता है
  • INTERFACE के साथ लक्ष्य को संशोधित नहीं किया गया है, लेकिन INTERFACE_INCLUDE_DIRECTORIES को निर्देशिका द्वारा विस्तारित किया गया है। चर एक पुस्तकालय के लिए सार्वजनिक शामिल निर्देशिकाओं की एक सूची है।
  • सार्वजनिक और आंतरिक से दोनों कार्यों को सार्वजनिक रूप से किया जाता है।

5
मैं CMAKE प्रलेखन के माध्यम से चला गया, लेकिन मुझे अभी भी नहीं मिला कि वे वास्तव में क्या मतलब है और किस संदर्भ में (फाइलें बनाते हैं या वे कैसे तैयार होते हैं)?
सिरिश

@ शिरीष: मैंने दस्तावेज़ीकरण को फिर से समझने की कोशिश की, आशा है कि मदद करता है।
usr1234567
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.