2016-04-15 9 views
9

जैसा कि मैं समझता हूं INTERFACE पुस्तकालय Visual Studio property sheets की तरह हैं, बहुत उपयोगी है। हम इसे स्थिर libs और प्रॉपर्टी गुणों के साथ जोड़ने के लिए उपयोग कर सकते हैं।आयातित लक्ष्य और इंटरफेस पुस्तकालयों के बीच अंतर क्या हैं?

लेकिन IMPORTED लक्ष्य मुझे परेशान करते हैं: मुझे कोई समस्या नहीं दिखाई दे सकती है जिसे केवल आयातित लक्ष्य के साथ हल किया जा सकता है।

+2

@ एंटोनियो इस प्रश्न को टैग करने के लिए विजुअल स्टूडियो के साथ क्या करना है? – Angew

+0

@Angew यह विजुअल स्टूडियो प्रॉपर्टी शीट्स को संदर्भित करता है, जिनमें से मुझे कुछ भी नहीं पता है। हालांकि मुझे सीएमके के बारे में पता है, मैं इस सवाल को पूरी तरह से समझ नहीं सकता। दूसरे शब्दों में कहा, विजुअल स्टूडियो के बारे में इस प्रश्न के ज्ञान को पूरी तरह उत्तर देने के लिए भी आवश्यक है। – Antonio

उत्तर

10

जब आप एक आयातित लक्ष्य बनाते हैं, तो आप सीएमके को बता रहे हैं: मेरे पास यह {स्थिर लाइब्रेरी है। साझा पुस्तकालय | मॉड्यूल पुस्तकालय | निष्पादन योग्य} डिस्क पर इस स्थान पर पहले ही बनाया गया है। मैं इसे अपने ऑनव बिल्डसिस्टम द्वारा बनाए गए लक्ष्य की तरह व्यवहार करने में सक्षम होना चाहता हूं, इसलिए ध्यान दें कि जब मैं ImportedTargetName कहता हूं, तो उस डिस्क पर उस बाइनरी को संदर्भित करना चाहिए (लागू होने पर संबंधित आयात lib के साथ, और इसी तरह)।

जब आप एक इंटरफ़ेस लाइब्रेरी बनाते हैं, तो आप सीएमके को बता रहे हैं: मेरे पास गुणों का यह सेट है (निर्देशिकाएं शामिल हैं आदि) जो क्लाइंट उपयोग कर सकते हैं, इसलिए यदि वे मेरे इंटरफ़ेस लाइब्रेरी में "लिंक" करते हैं, तो कृपया इन गुणों को प्रचारित करें उन्हें।

मौलिक अंतर यह है कि इंटरफ़ेस पुस्तकालयों को डिस्क पर किसी भी चीज़ का समर्थन नहीं किया जाता है, वे केवल आवश्यकताओं/गुणों का एक सेट हैं। आप एक इंटरफ़ेस लाइब्रेरी पर INTERFACE_LINK_LIBRARIES संपत्ति सेट कर सकते हैं यदि आप वास्तव में चाहते हैं, लेकिन यह वास्तव में उनके लिए डिज़ाइन नहीं किया गया था। वे क्लाइंट-उपभोग योग्य गुणों को समाहित करना चाहते हैं, और मुख्य रूप से सी ++ में हेडर-केवल पुस्तकालयों जैसी चीज़ों के लिए समझ में आते हैं।

यह भी ध्यान दें एक अंतरफलक पुस्तकालय है कि एक पुस्तकालय — वहाँ एक अंतरफलक निष्पादन जैसी कोई चीज नहीं है, लेकिन आप वास्तव में आयातित निष्पादनयोग्य हो सकता है। जैसे बाइसन के लिए एक पैकेज कॉन्फ़िग फ़ाइल बाइसन निष्पादन के लिए एक आयातित लक्ष्य निर्धारित कर सकते हैं, और अपनी परियोजना फिर कस्टम आदेश के लिए इसका इस्तेमाल कर सकते:

# In Bison package config file: 
add_executable(Bison IMPORTED) 
set_property(TARGET Bison PROPERTY IMPORTED_LOCATION ...) 

# In your project: 
find_package(Bison) 
add_custom_command(
    OUTPUT parser.c 
    COMMAND Bison tab.y -o parser.c 
    DEPENDS tab.y 
    ... 
) 

(बाइसन बस कुछ का एक उदाहरण आप में उपयोग करने के लिए चाहते हो सकता है के रूप में प्रयोग किया जाता है कस्टम आदेश, और कमांड लाइन शायद इसके लिए सही नहीं है)।

1

ऐसा लगता है कि बहुत सारे ओवरलैप हैं। आप एक साझा पुस्तकालय और डिस्क पर हेडर है कहने और और आवश्यक निर्देशिका में शामिल हो जाओ यह साथ लिंक आप इसे उपलब्ध बनाने के लिए इतना है कि अपने CMake के टुकड़े इस

target_link_libraries(my_target foo) 

क्या कर सकते हैं और स्वचालित रूप से।

आप इसे या तो इस तरह कर सकते हैं:

find_package(Foo) 

add_library(foo SHARED IMPORTED) 
set_target_properties(foo PROPERTIES 
    IMPORTED_LOCATION ${FOO_LIBRARIES} # The DLL, .so or .dylib 
    INTERFACE_INCLUDE_DIRECTORIES ${FOO_INCLUDE_DIR} 
    INTERFACE_COMPILE_DEFINITIONS "ENABLE_FOO" 
) 

या इस तरह:

add_library(foo INTERFACE) 
target_link_libraries(foo INTERFACE ${FOO_LIBRARIES}) 
target_include_directories(foo INTERFACE ${FOO_INCLUDE_DIR}) 
target_compile_definitions(foo INTERFACE "-DENABLE_FOO") 

वे दोनों काम करते हैं और हूबहू जहाँ तक मैं बता सकता व्यवहार करते हैं। add_library(foo INTERFACE IMPORTED) के माध्यम से भी 'आयातित इंटरफ़ेस लाइब्रेरी' उपलब्ध है, हालांकि यह काम नहीं कर रहा था और मुझे नहीं पता कि यह क्या है।

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

मुझे लगता है कि या तो उपयोग करें। मुझे लगता है कि इंटरफ़ेस लाइब्रेरी को समझना आसान है और आंतरिक पुस्तकालयों से INTERFACE गुणों के उपयोग के साथ अधिक संगत है।

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