2013-06-10 6 views
9

मैं एक छोटा प्रोग्राम बना रहा हूं जिसके लिए
चलाने के लिए एक छवि फ़ाइल foo.bmp की आवश्यकता है, इसलिए मैं प्रोग्राम को संकलित कर सकता हूं लेकिन इसे चलाने के लिए, मुझे foo.bmp को 'build' पर कॉपी करना होगा 'उपनिर्देशिका मैन्युअल रूप सेसीएमके: निर्देशिका बनाने के लिए कस्टम संसाधन जोड़ना

प्रोग्राम संकलन के रूप में उपनिर्देशिका बनाने के लिए foo.bmp को स्वचालित रूप से जोड़ने के लिए CMakeLists.txt में मुझे किस कमांड का उपयोग करना चाहिए?

उत्तर

9

ऐसा करने के लिए आपको बिल्ड निर्देशिका में आवश्यक फ़ाइल के लिए बिल्ड नियम बनाने के लिए add_custom_command का उपयोग करना चाहिए। फिर उन लक्ष्यों पर अपने लक्ष्यों से निर्भरता जोड़ें: सीएमके केवल एक लक्ष्य द्वारा आवश्यक होने पर कुछ बनाते हैं।

यदि आप स्रोत निर्देशिका से नहीं बना रहे हैं तो आपको केवल फाइलों की प्रतिलिपि बनाना सुनिश्चित करना चाहिए।

कुछ इस तरह:

project(foo) 

cmake_minimum_required(VERSION 2.8) 

# we don't want to copy if we're building in the source dir 
if (NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR) 

    # list of files for which we add a copy rule 
    set(data_SHADOW yourimg.png) 

    foreach(item IN LISTS data_SHADOW) 
     message(STATUS ${item}) 
     add_custom_command(
      OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${item}" 
      COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/${item}" "${CMAKE_CURRENT_BINARY_DIR}/${item}" 
      DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${item}" 
     ) 
    endforeach() 
endif() 

# files are only copied if a target depends on them 
add_custom_target(data-target ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/yourimg.png") 

इस मामले में मैं yourimg.png फ़ाइल पर निर्भरता के साथ एक "सभी" कस्टम लक्ष्य का उपयोग कर रहा प्रतिलिपि मजबूर करने के लिए है, लेकिन आप भी एक पर निर्भरता को जोड़ सकते हैं अपने मौजूदा लक्ष्यों का।

+0

क्या कर add_custom_target लाइन करता है। मैंने आपके कोड को संशोधित करने की कोशिश की और add_custom_target लाइन के लिए फ़ोरैच लूप भी शामिल किया लेकिन यह कई फ़ाइलों पर विफल रहता है – Archit

+0

हाँ, मुझे लगता है कि आपको निर्भरताओं के साथ समस्या है ... जैसा कि मैंने कहा है कि केवल लक्ष्य द्वारा आवश्यक फाइलें बनाई गई हैं। इसलिए यदि आपकी छवियों पर निर्भर कोई लक्ष्य नहीं है, तो वे नहीं बनाए जाएंगे। यही कारण है कि मैं अपने उदाहरण में "add_custom_target" जोड़ रहा हूं। बीटीडब्ल्यू एक बेहतर नियम 'add_custom_target (डेटा-लक्षित सभी $ $ data_HADOW} हो सकता है)' इसलिए यह हमेशा सभी छवियों पर निर्भर करता है। – Guillaume

1

इससे मदद मिल सकती है, मैंने फ़ाइल कमांड का उपयोग करके एक और समाधान की कोशिश की। विकल्प विकल्प है जो बस फ़ाइल या निर्देशिका को स्रोत से dest तक कॉपी करता है।

इस तरह

: FILE(COPY yourImg.png DESTINATION "${CMAKE_BINARY_DIR}")

सापेक्ष पथ भी गंतव्य के लिए काम करता है (। आप बस उदाहरण के लिए उपयोग कर सकते हैं)

डॉक्टर संदर्भ: https://cmake.org/cmake/help/v3.0/command/file.html

संबंधित मुद्दे