如何在基于现代目标的cmake中使用单元测试目标来管理图书馆的私人依赖

时间:2019-06-13 11:51:17

标签: unit-testing cmake

我有一个具有公共和私有依赖项的库A。单元测试包含在单独的可执行文件ATests中,该可执行文件需要链接A的私有和公共依赖项。

当前,我将A的所有私有依赖项显式链接到单元测试ATest。这导致许多代码重复,这变得越来越难以理解/维护。

add_library(A)
target_link_libraries(A PUBLIC Pub1 PRIVATE Priv1 Priv2)

add_executable(ATests)
target_link_libraries(ATests PRIVATE A Priv1 Priv2)

我曾考虑过为APrivDeps的私有依赖项创建一个单独的接口库A,但是,这看起来像是黑客。我非常怀疑它是否可移植,并且由于链接依赖关系的传播而会破坏静态链接。 (我必须导出帮助程序库APrivDeps。)

add_library(APrivDeps)
target_link_libraries(APrivDeps PUBLIC Priv1 Priv2)

add_library(A)
target_link_libraries(A PUBLIC Pub1 PRIVATE ADeps)

add_executable(ATests)
target_link_libraries(ATests PRIVATE A ADeps)

我希望有一种方法可以使配置简短且无代码重复,同时仍然遵循现代CMake基于目标的原理。

1 个答案:

答案 0 :(得分:0)

可以显式地传播私有依赖项。一种方法是使用 TARGET_PROPERTY generator expression

add_library(A)
target_link_libraries(A PUBLIC Pub1 PRIVATE Priv1 Priv2)

add_executable(ATests)
target_link_libraries(ATests PRIVATE A $<TARGET_PROPERTY:A,LINK_LIBRARIES>)

可能还需要传播其他属性,例如 INCLUDE_DIRECTORIESCOMPILE_OPTIONS 等。这确实有点像打破了现代 CMake 的基于目标的原则,因此请谨慎使用。对我来说,这似乎是一种合理的单元测试方法。