因此,我正在将项目的一部分制作为一个库,其中一些标头是该库的接口,其余部分是库本身私有的。因此,对于我的库,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
.
所以我的问题是,我该如何cleanly单独的标题,这样我就只能有我的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>)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)