CMake - 如何使库的私有标头可用于其测试
CMake - How to make private headers of a library available to its tests?
所以,我正在使项目的一部分成为一个库,其中一些标头是库的接口,其余的都是库本身私有的。因此,对于我的库,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>)
相关文章:
- std::is_invocable 用于测试任意方法是否存在的语法(不仅是运算符())
- 生成用于测试的随机结构的通用方法
- 用于测试目的:"special"哪些浮点数(IEEE754 32b)?
- 为了在测试中调用destuructor(用于测试),静态铸造基类有多么可怕
- 分配参数用于测试目的
- 捕获用于测试用例的系统log
- 用于测试Poco HTTPServer的包装程序handleRequest未编译
- 如何创建用于测试QTcpSocket的依赖项注入
- 用于测试字节序兼容性的工作流
- 宏用于创建多个用于测试的相似标识符
- 用于测试对象是否与提升范围兼容的元函数
- C++:将对象的创建与使用分开(用于测试目的)
- STL函数,用于测试值是否在某个范围内
- 一个C++函数,用于测试 C 字符串是否以后缀结尾
- 用于测试 func(args) 格式是否正确以及是否具有必需的返回类型的特征
- 用于测试c++性能的单元测试(合成基准)
- 是否有一种方法在试图写入文件的进程中生成错误?(用于测试目的)
- C++编译时谓词,用于测试是否可以使用 T 类型的参数调用 F 类型的可调用对象
- 用于测试路径查找算法的可能数据集
- Web-CAT CxxTest Eclipse GUI 用于测试结果未显示