2013-11-14 9 views
15

यह मेरा परियोजना का पेड़ है:CMake include_directories()

// foo.cpp 
#include "foo.hpp" 

अब समस्या है कि शीर्ष CMake में निर्देशिका सहित सफलतापूर्वक खोजने के foo:

project 
| + src 
| + external 
| | + foo 
| | | + include 
| | | | - foo.hpp 
| | | + src 
| | | | - foo.cpp 
| | | | - CMakeLists.txt 
| | | - CMakeLists.txt 
| | + CMakeLists.txt 
| + src 
| | - main.cpp 
| - CMakeLists.txt 

foo.cpp foo.hpp शामिल .एचपीपी, लेकिन अगर मैं उपप्रोजेक्ट में शामिल करता हूं तो यह नहीं करता है। इसके लिए कोई कारण? (निष्पादन योग्य संकलित होने से पहले निर्देशिका शामिल हैं)।

// project/CMakeLists.txt 
include_directories(external/foo/include) //OK 
add_subdirectory(external) 

add_executable(main main.cpp) 
target_link_libraries(main foo) 

// project/external/CMakeLists.txt 
add_subdirectory(foo) 

// project/external/foo/CMakeLists.txt 
include_directories(include) // NOT WORKING 
add_subdirectory(src) 

// project/external/foo/src/CMakeLists.txt 
add_library(foo foo.cpp) 
+0

शीर्ष स्तर के सीएमकेलिस्ट में 'बाहरी/शामिल' और 'बाहरी/foo/include' के बीच सीएमकेलिस्ट में foo के अंदर एक विसंगति प्रतीत होती है - शायद यह मुद्दा है? – Angew

+0

मैंने कुछ संपादन किए हैं, पहले कुछ त्रुटियां हो सकती हैं, लेकिन यह ठीक होना चाहिए – memecs

+0

दस्तावेज़ अन्यथा दावा करते हैं, लेकिन ऐसा लगता है कि निर्देशिका शामिल हैं उपनिर्देशिका द्वारा विरासत में नहीं। आप जांच सकते हैं कि यह एक अलग मिनी परियोजना का उपयोग कर मामला है या नहीं। – Angew

उत्तर

23

include_directories के लिए दस्तावेज़ का हवाला देते हुए:

को शामिल निर्देशिका वर्तमान CMakeLists फ़ाइल के लिए निर्देशिका संपत्ति में जुड़ जाते हैं INCLUDE_DIRECTORIES। वे भी मौजूदा सीएमकेलिस्ट फ़ाइल में प्रत्येक लक्ष्य के लिए लक्षित संपत्ति INCLUDE_DIRECTORIES में जोड़े गए हैं। लक्ष्य संपत्ति मान जनरेटर द्वारा उपयोग किए गए हैं।

INCLUDE_DIRECTORIES directory property सभी उपनिर्देशिकाओं और निर्देशिका में सभी लक्ष्यों को विरासत में मिला है।

  • include_directories के लिए निर्दिष्ट ${CMAKE_CURRENT_SOURCE_DIR} अनावश्यक है के रूप में संबंधित पथ डिफ़ॉल्ट रूप से इस निर्देशिका के सापेक्ष के रूप में व्याख्या कर रहे हैं। पठनीयता बढ़ाने के लिए आपको इसे बाहर फेंक देना चाहिए।
  • एक उपनिर्देशिका और उसके माता-पिता दोनों में एक निर्देशिका शामिल करना अनावश्यक है। आपको इससे बचना चाहिए और एक स्थान पर व्यवस्थित होना चाहिए।
  • get_property और message का उपयोग दोबारा जांचने के लिए करें कि सभी निर्देशिकाएं और लक्ष्य INCLUDE_DIRECTORIES संपत्ति में सही प्रविष्टियों के साथ समाप्त होते हैं।
  • यदि आप न्यूनतम आवश्यकता के रूप में सीएमके 2.8.11 की आवश्यकता के लिए स्वतंत्र हैं, तो include_directories को पूरी तरह से छोड़कर target_include_directories का उपयोग करने पर विचार करें। इसका लाभ यह है कि निर्भरताएं प्रति-लक्ष्य आधार पर हल हो जाती हैं जो आमतौर पर अधिक वांछनीय व्यवहार होती है।
+1

+1 किया जा सकता है। मेरे लिए समस्या हल हो गई। – thehouse

0

शायद यह एक दायरा समस्या है। मुझे लगता है कि आप यहां क्या करने की कोशिश कर रहे हैं /project/external/foo/CMakeLists से /project/CMakeLists पर सेटिंग प्रसारित करना है और इस तरह की सेटिंग /project/src/CMakeLists पर प्रचारित की जा सकती है। लेकिन दुर्भाग्यवश, कैश किए गए मूल्यों को छोड़कर, सेमेक में निम्न स्तर से उच्च स्तरीय सीएमकेलिस्ट तक प्रचार संभव नहीं है। इसका अर्थ यह है कि आपको /project/src/CMakeLists.txt में include_directories (${CMAKE_SOURCE_DIR}/external/foo/include) जोड़ने की भी आवश्यकता होगी। या, जैसा कि आपने पहले ही किया है, आप इस पंक्ति को शीर्ष-स्तर के सीएमकेलिस्ट में जोड़ सकते हैं।

+1

'लेकिन दुर्भाग्य से, निम्न स्तर से उच्च स्तरीय सीएमकेलिस्ट से प्रचार कैमेक में संभव नहीं है, कैश किए गए मानों को छोड़कर यह सच नहीं है, के लिए नियमित (गैर-कैश) चर [PARENT_SCOPE] (http://www.cmake.org/cmake/help/v2.8।12/cmake.html # कमांड: सेट) का उपयोग 'target_include_directories' के लिए –