C++ CMake测试库,标题位置问题

C++ CMake测试库,标题位置问题,c++,unit-testing,cmake,C++,Unit Testing,Cmake,因此,我将一个项目的一部分创建为一个库,其中一些头是库的接口,其余的头是库本身的私有头。因此,对于我的库,CMAKE部分如下所示: add_library(${PROJECT_NAME} ${PROJECT_SOURCES} "${PROJECT_BINARY_DIR}/libversion.h") add_library(my::lib ALIAS ${PROJECT_NAME}) target_include_directories(${PROJECT_NAME} PRIVATE

因此,我将一个项目的一部分创建为一个库,其中一些头是库的接口,其余的头是库本身的私有头。因此,对于我的库,CMAKE部分如下所示:

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
    )
但这只允许我测试我的公共接口。如果我想对我的库进行单元测试,我将如何在project
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}
    )
但这需要根据使用情况构建两个不同的目标。一个用于我的应用程序链接到alias
my::lib
,另一个用于单元测试,链接alias
my::lib::testing


所以我的问题是,如何清晰地分离标题,这样我就可以只让目标显示我的
接口
标题,但仍然可以通过测试目标访问其余的标题?

私有项和公共项都填充目标的INCLUDE_DIRECTORIES属性,因此,您可以尝试在测试项目的target_include_目录中使用它

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>)
add_可执行文件(${TEST_NAME}${TEST_SOURCES})
添加测试(名称LibTest命令${test\u名称})
目标链接库(${TEST\u NAME}
私有${Boost_库}
私有my::lib
)
目标目录(${TEST\u NAME}PRIVATE$)