शामिल करें और सीएमके में target_include_directories के बीच क्या अंतर है?


134

मेरे पास मेरे C ++ कोड के लिए एक निर्देशिका संरचना है जो इस प्रकार है:

|
|->include
|->src

मैं अपने कोड के लिए CMakeLists.txt फाइल लिख रहा हूं। मैं इसके include_directoriesऔर target_include_directoriesअंदर के अंतर को समझना चाहता हूं CMake

उनके उपयोग में और मेरे शामिल फ़ाइल पथ को जोड़ने के लिए क्या अंतर है जो मुझे उपयोग करना चाहिए?


4
आप के लिए प्रलेखन पढ़ा है include_directoriesऔर target_include_directories? यह क्या है कि आप उनके बीच अंतर के बारे में नहीं समझते हैं?
कुछ प्रोग्रामर

74
प्रलेखन में कोई स्पष्टता नहीं है। मैंने इसे पढ़ा और यह बताया कि एंग्यू ने अपने उत्तर में क्या लिखा है, लेकिन कोई वर्णन नहीं है, कोई उदाहरण नहीं है और एक प्रणाली के लिए जो परियोजना निर्माण के लिए है, सीएमके प्रलेखन में कोई परियोजना आधारित उदाहरण नहीं हैं। अगर सीएमके का एक अच्छा और संपूर्ण दस्तावेज होता, तो मैं इन सवालों के साथ समुदाय पर बोझ नहीं डाल रहा होता।
उज्जवल आर्यन

Cmake की अवधारणाओं को खराब रूप से प्रलेखित किया गया है। विशेष रूप से लक्ष्य और "अलक्षित"।
जॉन ग्रीन

जवाबों:


148

include_directories(x/y)निर्देशिका गुंजाइश को प्रभावित करता है। इस CMakeList में सभी लक्ष्य, साथ ही इसके कॉल के बिंदु के बाद जोड़े गए सभी उपनिर्देशिकाओं में, x/yउनके शामिल पथ में जोड़े गए पथ होंगे।

target_include_directories(t x/y)लक्ष्य गुंजाइश है - यह x/yलक्ष्य के लिए शामिल पथ में जोड़ता है t

यदि आप अपने सभी लक्ष्यों में शामिल निर्देशिकाओं का उपयोग करते हैं, तो आप पहले वाला चाहते हैं। यदि पथ एक लक्ष्य के लिए विशिष्ट है, या यदि आप पथ की दृश्यता का बेहतर नियंत्रण चाहते हैं, तो आप बाद वाला चाहते हैं। बाद के तथ्य यह है कि से आता है target_include_directories()का समर्थन करता है PRIVATE, PUBLICऔर INTERFACEक्वालिफायर।


35
मुझे लगता है कि उत्तरार्द्ध को आम तौर पर पसंद किया जाना चाहिए (जब तक कि कोई सीमेक 3 का उपयोग कर रहा है)। इसमें x/yकिसी भी आश्रित लक्ष्य के शामिल पथ में डालने का अतिरिक्त लाभ है tजो उनके target_link_librariesआदेशों में उपयोग करते हैं । बेशक पूर्व के लिए एक जगह है, लेकिन मेरा मानना ​​है कि उत्तरार्द्ध आमतौर पर बेहतर होता है।
फिल

2
मूल उत्तर में कहा गया है कि केवल लक्ष्य और उप के बाद जोड़े गए include_directoriesप्रभाव प्रभावित होंगे। मैं उत्तर का संपादन कर रहा हूं: प्रलेखन में स्पष्ट रूप से कहा गया है कि वर्तमान CMakeLists के सभी लक्ष्य प्रभावित हैं। दस्तावेज़ में उल्लेख नहीं है लेकिन कॉल के प्रभावित होने के बाद केवल उपखंड (जैसा कि मूल उत्तर में सही ढंग से कहा गया था)
tamas.kenez

@Phil, target_include_directoriesCMake 2.8.11 (मई 2013) में पेश किया गया है
tamas.kenez

@ tamas.kenez इसे मेरे ध्यान में लाने के लिए धन्यवाद, निश्चित। मैं काफी आश्वस्त था कि यह "अब से" बात है।
Angew को अब SO

40

क्या अलावा Angew का जवाब सही ढंग से कहते हैं, के बीच एक और बहुत ही महत्वपूर्ण अंतर include_directoriesऔर target_include_directoriesजो है, जब साथ प्रयोग किया जाता PUBLICया INTERFACE, बाद से भरें INTERFACE_INCLUDE_DIRECTORIESलक्ष्य की संपत्ति। यह गुण तब उपयोगी होता है जब कोई अन्य लक्ष्य target_link_librariesमूल लक्ष्य से लिंक करने के लिए उपयोग करता है, क्योंकि लिंकिंग लक्ष्य में स्वचालित रूप से वे निर्देशिकाएं शामिल होंगी। उदाहरण देखें ।

यह महत्वपूर्ण विशेषता दस्तावेज़ीकरण में बहुत अच्छी तरह से छिपी हुई है: target_include_directories आबादी का उल्लेख करती है INTERFACE_INCLUDE_DIRECTORIES, जिसका प्रलेखन कहता है:

जब लक्ष्य निर्भरता लक्ष्य_लिंक_ लाइब्रेरी () का उपयोग करके निर्दिष्ट की जाती है , तो सीएमके उपभोक्ता के निर्माण गुणों को निर्धारित करने के लिए सभी लक्ष्य निर्भरताओं से इस संपत्ति को पढ़ेगा।


यह पहली बार है जब मैंने कभी PUBLICआदि गुणों की समझ में आने वाला विवरण पढ़ा है ! साभार: D
RL-S

2

जैसा कि @Angew ने कहा, बहुत अंतर है:

स्रोत-ट्री 2 में सभी फ़ाइलों के लिए 1, शामिल_अनुकूलित () पहुंच योग्य है, जब संकलन के लिए एक विशिष्ट लक्ष्य के लिए target_include_directories () केवल पहुंच योग्य है।

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