我有一个具有公共和私有依赖项的库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基于目标的原理。
答案 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_DIRECTORIES
、COMPILE_OPTIONS
等。这确实有点像打破了现代 CMake 的基于目标的原则,因此请谨慎使用。对我来说,这似乎是一种合理的单元测试方法。