gpt4 book ai didi

c++ - CMake - 如何使库的私有(private) header 可用于其测试?

转载 作者:可可西里 更新时间:2023-11-01 18:31:16 31 4
gpt4 key购买 nike

因此,我正在将一个项目的一部分制作成一个库,其中一些 header 是库的接口(interface),其余部分是库本身私有(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
)

但这只允许我测试我的公共(public)接口(interface)。如果我想对我的库进行单元测试,我将如何声明对项目 lib 中剩余 header 的访问权限?我看到的方式是添加一个全新的目标 my::lib::testing ,它将接口(interface)声明为当前源目录(所有 header 当前所在的位置,将公共(public) header 与私有(private) header 分开是另一个我还没有处理的问题)。所以像这样:

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 的单元测试。

所以我的问题是,我如何干净地分离 header ,这样我就可以只让目标显示我的 INTERFACE header ,但仍然可以通过我的测试目标访问剩余的 header ?

最佳答案

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

关于c++ - CMake - 如何使库的私有(private) header 可用于其测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35385908/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com