CMake测试库,标题位置问题

She*_*eph 7 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 ${Boost_INCLUDE_DIRS}
    PRIVATE ${PROJECT_BINARY_DIR} #to locate libversion.h
    INTERFACE ${PUBLIC_INCLUDE_HEADERS}
    )
Run Code Online (Sandbox Code Playgroud)

然后我的测试目标:

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

target_link_libraries(${TEST_NAME} 
    PRIVATE ${Boost_LIBRARIES}
    PRIVATE my::lib
    )
Run Code Online (Sandbox Code Playgroud)

但这只允许我测试我的公共接口.如果我想对我的库进行单元测试,我将如何声明对项目中剩余标题的访问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}
    )
Run Code Online (Sandbox Code Playgroud)

但这需要根据用途构建两个不同的目标.一个用于我的应用程序链接到别名my::lib,一个用于单元测试,链接别名my::lib::testing.

所以我的问题是,如何干净地分隔标题,以便我只能INTERFACE显示目标显示的标题,但仍然可以通过我的测试目标访问剩余的标题?

小智 7

PRIVATE和PUBLIC项都填充目标的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>)
Run Code Online (Sandbox Code Playgroud)