2014-11-20 6 views
28

हमारे कार्यप्रवाह में, हम एक मॉड्यूल एक कि कई हेडर फाइल से बना है, मॉड्यूल एक किसी भी बाइनरी (पक्ष टिप्पणी नहीं उत्पादन हो सकता है: यह स्पष्ट रूप से अन्य मॉड्यूल, कि हेडर से कुछ में शामिल द्वारा उपयोग किया जाएगा द्विआधारी उत्पादन के लिए मॉड्यूल ए)।सीएमके शो हेडर कैसे हैं- जो किसी भी बाइनरी लक्ष्य का हिस्सा नहीं हैं-आईडीई में?

एक अच्छा उदाहरण एक हैडर-केवल पुस्तकालय, जिसके लिए CMake 3 परिचय INTERFACE पुस्तकालय की धारणा के लिए एक अच्छा समर्थन के लिए धन्यवाद होगा (this SO answer देखते हैं, और CMake के documentation of the feature)।

हम मॉड्यूल से बाहर एक अंतरफलक पुस्तकालय लक्ष्य बना सकते हैं एक:

add_library(module_A INTERFACE) 

हमें CMakes लक्ष्यों के सभी अच्छा सुविधाओं देता है कि (यह एक और लक्ष्य की निर्भरता के रूप में उपयोग करने के लिए संभव है, यह निर्यात करने के लिए , आगे आवश्यकताओं आदि संक्रामक करने के लिए)

लेकिन इस मामले में, मॉड्यूल में हेडर एक हमारे आईडीई (Xcode में दिखाई नहीं देती हैं, फिर भी हम यह सबसे/हर दूसरे IDE के साथ समान होने की अपेक्षा)।

यह वर्कफ़्लो में एक बड़ी कमी साबित होता है, क्योंकि हमें संस्करण के लिए आईडीई में दिखाए जाने के लिए मॉड्यूल ए लिखने वाली फ़ाइलों की आवश्यकता है। क्या यह हासिल करना संभव है?

+0

Ah ने मेरी टिप्पणी हटा दी। अच्छा प्रश्न। – IdeaHat

+0

@IdeaHat प्रश्न में आपकी रूचि और आपके सुझाव के लिए धन्यवाद। अफसोस की बात है, 'add_library' कमांड का 'इंटरफेस' रूप किसी भी * फ़ाइल * तर्क की अपेक्षा नहीं करता है (देखें [दस्तावेज़ीकरण में अंतिम रूप] (http://www.cmake.org/cmake/help/v3.0/command /add_library.html?highlight=add_library))। असल में, हमें अनिवार्य रूप से 'इंटरफेस' की आवश्यकता नहीं है, लेकिन यह केवल ** म्यूटेबल ** गैर-बाइनरी लक्ष्य है जिसे हम जानते हैं। [संदर्भ के लिए, आइडियाहैट सोच रहा था कि अगर हम अपने 'इंटरफेस' फॉर्म में 'add_library' कमांड' में हेडर फाइलें प्रदान कर सकते हैं तो –

+0

एक हैक तरीका एक डमी कस्टम लक्ष्य (कभी भी निर्मित नहीं किया गया है, या कोई बिल्ड कदम नहीं) स्रोत के रूप में इन फ़ाइलों के साथ ... मेरी व्यक्तिगत शिक्षा के लिए, क्या आपके पास सीएमके की उत्परिवर्तनीय परिभाषा का एक लिंक है? – IdeaHat

उत्तर

18

लाइन के नीचे कई महीने, मुझे INTERFACE लाइब्रेरी के लिए शीर्षलेख फ़ाइलों को सीधे सूचीबद्ध करने का कोई तरीका नहीं मिला।

चूंकि प्रश्न में अभी भी कुछ विचार हैं, इसलिए मैं यही कर रहा हूं (यानी वर्तमान में उपलब्ध कम हैक जैसा दिखता है)।

कल्पना करें मॉड्यूल ए एक शीर्षलेख केवल लाइब्रेरी है। CMakeLists.txt में अपने लक्ष्य की घोषणा:)

+0

काफी समय से ऐसा करने का एक तरीका ढूंढ रहा था और अंततः आपके समाधान ने मुझे पूरा किया। धन्यवाद! –

9

आप:

# Define 'modA_headers' variable to list all the header files 
set(modA_headers 
    utility.h 
    moreUtilities.h 
    ...) 

add_library(moduleA INTERFACE) # 'moduleA' is an INTERFACE pseudo target 

# 
# From here, the target 'moduleA' can be customised 
# 
target_include_directories(moduleA ...) # Transitively forwarded 
install(TARGETS moduleA ...) 

# 
# HACK: have the files showing in the IDE, under the name 'moduleA_ide' 
# 
add_custom_target(moduleA_ide SOURCES ${modA_headers}) 

के बाद से मैं CMake के आगे विज्ञप्ति उम्मीद एक और अधिक शब्दार्थ सही दृष्टिकोण है, जो तब स्वीकार किया जाएगा पेशकश करने के लिए मैं इस जवाब को स्वीकार नहीं करते, सीएमके 3.1 में नए target_sources कमांड का उपयोग कर सकते हैं।

add_library(moduleA INTERFACE) 
target_include_directories(moduleA INTERFACE ...) 
target_sources(moduleA INTERFACE 
    ${CMAKE_CURRENT_SOURCE_DIR}/utility.h 
    ${CMAKE_CURRENT_SOURCE_DIR}/moreUtilities.h 
) 

यह भी संक्रमणीय है।

http://www.cmake.org/cmake/help/v3.1/command/target_sources.html#command:target_sources

लक्ष्य जो INTERFACE_SOURCES है निर्यात करने में सक्षम नहीं किया जा रहा की सीमा CMake 3.3 के लिए हटा दिया गया है।

+4

यह डब्ल्यू इस अर्थ में कि हेडर को आपकी मौजूदा लाइब्रेरी से जोड़ने वाली अन्य मौजूदा परियोजनाओं में जोड़ा जाएगा, लेकिन यदि आपके पास अपनी लाइब्रेरी से लिंक करने वाली कोई परियोजना नहीं है तो यह काम नहीं करता है। इसलिए यदि आपके पास एक निष्पादन योग्य के साथ एक परीक्षण प्रोजेक्ट है जो आपकी इंटरफ़ेस लाइब्रेरी से लिंक करता है, तो इस तरह के प्रोजेक्ट में इसके स्रोतों के साथ लाइब्रेरी हेडर होंगे। –

+3

यह @ फ्रांसिस्कोएगुइलेरा द्वारा उठाया गया एक बहुत अच्छा मुद्दा है। स्टीवयर, क्या अभी तक उस तारीख के लिए कोई अच्छा समाधान नहीं है? – Ela782

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