CMake - 如何使库的私有标头可用于其测试

CMake - How to make private headers of a library available to its tests?

本文关键字:用于 测试 何使库 CMake      更新时间:2023-10-16

所以,我正在使项目的一部分成为一个库,其中一些标头是库的接口,其余的都是库本身私有的。因此,对于我的库,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
    )

但这只允许我测试我的公共接口。如果我想对我的库进行单元测试,我将如何声明对项目 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标头,但仍可以通过我的测试目标访问其余标头?

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>)