कीवर्ड का अर्थ क्या है PUBLIC
, PRIVATE
है, और INTERFACE
CMake के से संबंधित target_include_directories
?
जवाबों:
ये कीवर्ड्स बताने के लिए उपयोग किया जाता है जब की सूची निर्देशिका आप लक्षित करने के लिए गुजर रहे हैं की जरूरत है शामिल हैं। जब तक , इसका मतलब है कि अगर उन निर्देशिकाओं को शामिल करना आवश्यक है:
जब 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 प्रलेखन में इस बिल्ड विनिर्देश और उपयोग आवश्यकताओं के गुणों के बारे में अधिक जानकारी है ।
INTERFACE
। target_include_directories(libname INTERFACE include PRIVATE include/libname)
। इसका मतलब है कि आपकी लाइब्रेरी के भीतर आप सीधे फाइलें शामिल कर सकते हैं, लेकिन लाइब्रेरी के उपयोगकर्ता के रूप में आपको libname/
पहले सम्मिलित करना होगा ।
target_include_directories()
निष्पादन योग्य लक्ष्य के लिए कॉल कर सकते हैं , यदि आपको उन निर्देशिकाओं को सेट करने की आवश्यकता होती है, जिसमें उन हेडर फ़ाइलों का उपयोग किया जाता है, जिन्हें खोजने के लिए हेडर फाइल का उपयोग किया जाना है (उदाहरण के लिए: Boost :: Program_options, यदि आप इसका उपयोग अपने main()
कार्य में तर्क के लिए करते हैं) । आप शायद PRIVATE
इस मामले में कीवर्ड का उपयोग करेंगे, क्योंकि निष्पादन योग्य को संकलित करने के लिए इन फ़ाइलों की आवश्यकता होती है। मुझे नहीं पता कि वहाँ के लिए INTERFACE
या PUBLIC
एक निष्पादन योग्य पर कुछ उपयोग है , हालांकि।
निम्नलिखित तर्कों के दायरे को निर्दिष्ट करने के लिए आंतरिक, सार्वजनिक और निजी कीवर्ड आवश्यक हैं। निजी और सार्वजनिक आइटम INCLUDE_DIRECTORIES <लक्ष्य> की संपत्ति को आबाद करेंगे। सार्वजनिक और आंतरिक आइटम INTERFACE_INCLUDE_DIRECTORIES <लक्ष्य> की संपत्ति को आबाद करेंगे। निम्नलिखित तर्कों में निर्देशिकाएं शामिल हैं।
प्रलेखन से: http://www.cmake.org/cmake/help/v3.0/command/target_include_direct.html
अपने स्वयं के शब्दों के साथ प्रलेखन को फिर से लिखना: