तो, मैं एक प्रोजेक्ट का हिस्सा कुछ लाइब्रेरी के साथ लाइब्रेरी में इंटरफेस कर रहा हूं, और बाकी लाइब्रेरी के लिए निजी हैं।सीएमके लाइब्रेरी का परीक्षण, हेडर लोकेशन इश्यू
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
हेडर लक्ष्य द्वारा दिखाया गया हो सकता है, लेकिन अभी भी अपने परीक्षण लक्ष्य से शेष हेडर का उपयोग करते हैं?