2016-02-13 5 views
5

तो, मैं एक प्रोजेक्ट का हिस्सा कुछ लाइब्रेरी के साथ लाइब्रेरी में इंटरफेस कर रहा हूं, और बाकी लाइब्रेरी के लिए निजी हैं।सीएमके लाइब्रेरी का परीक्षण, हेडर लोकेशन इश्यू

add_library(${PROJECT_NAME} ${PROJECT_SOURCES} "${PROJECT_BINARY_DIR}/libversion.h") 
add_library(my::lib ALIAS ${PROJECT_NAME}) 

target_include_directories(${PROJECT_NAME} 
    PRIVATE ${Boost_INCLUDE_DIRS} 
    PRIVATE ${PROJECT_BINARY_DIR} #to locate libversion.h 
    INTERFACE ${PUBLIC_INCLUDE_HEADERS} 
    ) 

और फिर अपने परीक्षण लक्ष्य:

add_executable(${TEST_NAME} ${TEST_SOURCES}) 
add_test(NAME LibTest COMMAND ${TEST_NAME}) 

target_link_libraries(${TEST_NAME} 
    PRIVATE ${Boost_LIBRARIES} 
    PRIVATE my::lib 
    ) 

लेकिन यह केवल मुझे मेरे सार्वजनिक इंटरफ़ेस का परीक्षण करने की अनुमति देता है तो मेरी लाइब्रेरी के लिए CMake हिस्सा तरह दिखता है। अगर मैं अपनी लाइब्रेरी का परीक्षण करना चाहता हूं, तो मैं परियोजना lib में शेष शीर्षकों तक पहुंच घोषित करने के बारे में कैसे जाउंगा? जिस तरह से मैं इसे देखता हूं, वह एक नया नया लक्ष्य my::lib::testing जोड़ना होगा जो इंटरफ़ेस को वर्तमान स्रोत निर्देशिका के रूप में घोषित करता है (जहां वर्तमान में सभी शीर्षलेख स्थित हैं, निजी हेडर से सार्वजनिक पृथक करना एक और मुद्दा है जिसे मैंने अभी तक संभाला है)। इस तरह तो कुछ:

add_library(${PROJECT_NAME}_TESTING ${PROJECT_SOURCES} "${PROJECT_BINARY_DIR}/libversion.h") 
add_library(my::lib::testing ALIAS ${PROJECT_NAME}_TESTING) 

target_include_directories(${PROJECT_NAME}_TESTING 
    PRIVATE ${Boost_INCLUDE_DIRS} 
    PRIVATE ${PROJECT_BINARY_DIR} #to locate libversion.h 
    INTERFACE ${CMAKE_CURRENT_SOURCE_DIR} 
    ) 

लेकिन यह दो अलग-अलग लक्ष्यों की आवश्यकता है उपयोग के आधार पर निर्माण किया जाना है। मेरे आवेदन के लिए उपनाम my::lib और यूनिट परीक्षण के लिए एक को जोड़ने के लिए, उपनाम my::lib::testing लिंकिंग।

तो मेरे सवाल है, मैं कैसे सफाई से अलग हेडर तो मैं सिर्फ अपने INTERFACE हेडर लक्ष्य द्वारा दिखाया गया हो सकता है, लेकिन अभी भी अपने परीक्षण लक्ष्य से शेष हेडर का उपयोग करते हैं?

उत्तर

3

निजी और सार्वजनिक आइटम दोनों लक्ष्य की INCLUDE_DIRECTORIES संपत्ति को पॉप्युलेट करते हैं, ताकि आप परीक्षण प्रोजेक्ट के लिए target_include_directories में इसका उपयोग करने का प्रयास कर सकें।

add_executable(${TEST_NAME} ${TEST_SOURCES}) 
add_test(NAME LibTest COMMAND ${TEST_NAME}) 

target_link_libraries(${TEST_NAME} 
    PRIVATE ${Boost_LIBRARIES} 
    PRIVATE my::lib 
    ) 

target_include_directories(${TEST_NAME} PRIVATE $<TARGET_PROPERTY:my::lib,INCLUDE_DIRECTORIES>) 
संबंधित मुद्दे