我正在编译链接 libif 的多个 C++ 应用程序(app1、app2)。libif 接口的库有两个版本(libV1 libV2)。
根据链接到它的应用程序,我需要 libif 来连接 libV1(对于 app1)xor libV2(对于 app2)。
以下代码旨在描述这种情况。
add_library(libV1 STATIC IMPORTED GLOBAL)
...
add_library(libV2 STATIC IMPORTED GLOBAL)
...
#app1
add_library(libif ${other_sources})
target_link_libraries(libif INTERFACE libV1)
add_executable(app1 ${sources})
target_link_libraries(app1 PRIVATE libif)
#app2
add_library(libif ${other_sources})
target_link_libraries(libif INTERFACE libV2)
add_executable(app2 ${sources})
target_link_libraries(app2 PRIVATE libif)
以下代码旨在描述所需的结果:
add_library(libV1 STATIC IMPORTED GLOBAL)
...
add_library(libV2 STATIC IMPORTED GLOBAL)
...
add_library(libif ${other_sources})
target_link_libraries(libif INTERFACE $<app1_consumes_me:libV1> $<app2_consumes_me:libV2>)
add_executable(app1 ${sources})
target_link_libraries(app1 PRIVATE libif)
add_executable(app2 ${sources})
target_link_libraries(app2 PRIVATE libif)
是否有任何成语说“CMake 链接/接口库取决于使用它的目标。”?
我认为最简单的 - 虽然不是“漂亮”的解决方案需要我创建 2 个 libif 版本:“libif_libV1”和“libif_libV2”。然后它也会产生任何依赖库的 n 个不同版本。但是有没有更好的方法?这是一个非常罕见的用例吗?
我已经假设生成器表达式不是这项工作的正确工具 - 但也许有一个专门用于这种情况的宏/函数。