2009-07-22 5 views
44

द्वारा उत्पन्न विजुअल स्टूडियो सी ++ प्रोजेक्ट में हेडर फाइलों को सूचीबद्ध करना मैं अपने उत्पाद के लिए एक सेमेक आधारित बिल्ड सिस्टम बना रहा हूं। समस्या यह है कि सेमेक द्वारा उत्पन्न विजुअल स्टूडियो प्रोजेक्ट, समाधान ब्राउज़र में हेडर फ़ाइलों को प्रदर्शित नहीं करता है।सेमेक

मैं क्या CMakeList.txt में जोड़ने के लिए हेडर फाइल सूचीबद्ध करने की आवश्यकता? पसंदीदा समाधान वह है जहां प्रत्येक विशेष शीर्षलेख फ़ाइल को सूचीबद्ध करने की आवश्यकता नहीं है।

समाधान यहाँ एक समाधान मैं के साथ आया है:

file(GLOB_RECURSE INCS "*.h") 
add_library(myLib ${SRCS} ${INCS}) 

धन्यवाद

+5

एक बोनस आप source_group (हेडर फ़ाइलें $ {Incs}) फ़ोल्डर –

उत्तर

34

बस स्रोत फ़ाइलों के साथ हेडर फाइल जोड़ें:

PROJECT (Test) 

ADD_EXECUTABLE(Test test.cpp test.h) 

या इसका उपयोग करते चर:

PROJECT (Test) 

SET(SOURCE 
    test.cpp 
) 

SET(HEADERS 
    test.h 
) 

ADD_EXECUTABLE(Test ${SOURCE} ${HEADERS}) 
+6

IMO (@Simeon को छोड़कर) बात इन उत्तरों के सभी याद आती है वी.एस. एक अलग में उन्हें प्रदर्शित करने के लिए क्या कर सकते हैं के रूप में है, जिसे आप सूचीबद्ध 1. हेडर स्पष्ट निर्भरता आसानी से उन आप वास्तव में स्रोत में उपयोग कर रहे हैं से तालमेल न बिठा प्रवाहित हो जाते हैं के रूप में, और 2. CMake पहले से ही जो आप शीर्षलेख जानता है: 't क्योंकि, स्पष्ट रूप से हेडर फाइल के सभी सूचीबद्ध करना चाहते हैं उपयोग करें, इसलिए मैन्युअल रूप से उन्हें इनपुट करने के लिए यह अनावश्यक है। इसलिए हमें वास्तव में एक ऐसे उत्तर की आवश्यकता है जो सीएमकेक्स को हेडर निर्भरताओं का ज्ञान ले ले, और समाधान के लिए उन्हें समूह में चिपकाएं। –

+0

@ जेफ ट्राउल: असल में सीएमके नहीं जानता कि आप किस हेडर का उपयोग करते हैं - यह कई भाषाओं और एकाधिक कंपाइलर्स के साथ काम करता है, और हेडर की रिपोर्ट करने वाले कंपाइलर्स पर भरोसा नहीं कर सकता है। इसलिए हमें उन्हें स्पष्ट रूप से सूचीबद्ध करने की आवश्यकता है। यह स्रोत कोड वितरण बनाने के लिए भी क्लीनर है। –

+1

मैं सराहना करता हूं कि निर्भरता स्कैनर सुविधा केवल कुछ भाषाओं के लिए काम कर सकती है ... लेकिन यह सी ++ के लिए काम करती है, और यह जानना अच्छा होगा कि इस ज्ञान के पास पहले से ही विजुअल स्टूडियो के उपयोगकर्ताओं के लिए उपलब्ध है। यदि ऐसा नहीं है, कम से कम कुछ प्रकार का हुक है ताकि हम इसे स्वयं को सीएमके कोड (स्रोत_ग्रुप के माध्यम से) में लिख सकें। निर्भरताओं की एक स्पष्ट सूची निश्चित रूप से समय के साथ बाँध जाएगी, क्योंकि संकलन काम करता रहेगा भले ही यह गलत हो। साथ ही, यह अनावश्यक ... मेरे लिए –

18

इस के लिए बुनियादी चाल लक्ष्य (या तो निष्पादन या लाइब्रेरी) से एक के लिए हेडर फाइल जोड़ना है। यह विशेष रूप से परेशान है क्योंकि सेमेक पहले से ही सभी हेडर फ़ाइल निर्भरताओं को जानता है और इसे हमारे लिए ख्याल रखना चाहिए। आप आगे source_group आदेश का उपयोग कर इसे व्यवस्थित कर सकते हैं:

source_group("My Headers" FILES ${MY_HDRS}) 

नोट आप Xcode में भी एक ही बात करने के लिए किया है।

9

मैं इस पृष्ठ पर अन्य पदों के लिए धन्यवाद एक क्यूटी परियोजना के लिए एक निर्माण प्रणाली में काम करते हुए एक ही समस्या थी और मैं इस समाधान के साथ बाहर आया,। मैंने अपने मेकफ़ाइल से अनुकूलित एक पूर्ण उदाहरण शामिल किया। उम्मीद है की यह मदद करेगा!

cmake_minimum_required (VERSION 2.6) 
project (DemoSolution) 

find_package(Qt4 REQUIRED) 
include(${QT_USE_FILE}) 
add_definitions(${QT_DEFINITIONS}) 

include_directories (../../include/) 
set(CMAKE_INCLUDE_CURRENT_DIR ON) 

file(GLOB Demo_SOURCES *.cpp) 
file(GLOB Demo_HEADERS *.hpp) 
file(GLOB Demo_FORMS *.ui) 
file(GLOB Demo_RESOURCES resources.qrc) 

qt4_wrap_cpp(Demo_MOC ${Demo_HEADERS}) 
qt4_wrap_ui(Demo_FORMS_HEADERS ${Demo_FORMS}) 
qt4_add_resources(Demo_RESOURCES_RCC ${Demo_RESOURCES}) 

source_group("Headers" FILES ${Demo_HEADERS}) 
source_group("MOC" FILES ${Demo_MOC}) 

set(QT_USE_QTNETWORK, true) 
set(QT_USE_QTSQL, true) 
set(QT_USE_QTXML, true) 

add_library(Demo SHARED 
    ${Demo_SOURCES} 
    ${Demo_HEADERS} 
    ${Demo_MOC} 
    ${Demo_FORMS_HEADERS} 
    ${Demo_RESOURCES_RCC} 
    ) 

target_link_libraries(Demo ${QT_LIBRARIES}) 
add_definitions(-D_DEMO_EXPORTS) 
+4

यह ग्लोबिंग करने के लिए अच्छे फार्म नहीं है के संयोजन के बाद है। http://stackoverflow.com/questions/1027247/best-way-to-specify-sourcefiles-in-cmake। cmake प्रलेखन से: हम को GLOB उपयोग करने की अनुशंसा नहीं है अपने स्रोत पेड़ से स्रोत फ़ाइलों की एक सूची इकट्ठा। यदि कोई सीएमकेलिस्ट नहीं है।जब कोई स्रोत जोड़ा या निकाला जाता है तो txt फ़ाइल में परिवर्तन होता है तो जेनरेट बिल्ड सिस्टम को पता नहीं चल सकता कि सीएमके को पुन: उत्पन्न करने के लिए कहां से पूछना है। – Vitali