gpt4 book ai didi

c++ - 如何在 CMake 中对目标依赖项进行分组?

转载 作者:行者123 更新时间:2023-12-02 10:20:56 31 4
gpt4 key购买 nike

我有一个相当复杂的make我正在尝试迁移到现代 CMake 用法的基于项目的项目。在 Makefile ,我有几个类似的共享库目标,它们共享大部分相同的编译标志。所以,它看起来像这样:

add_library(lib1 SHARED src1.cpp src2.cpp)
target_compile_options(lib1 PUBLIC -public-flag1 -public-flag2 -unique-flag3 PRIVATE -private-flag)

add_library(lib2 SHARED src3.cpp src4.cpp)
target_compile_options(lib2 PUBLIC -public-flag -public-flag2 PRIVATE -private-flag)

有什么方法可以抽象出常见的依赖关系,这样我就不必在每个目标下重复它们?似乎 Interface Library将是这样做的方法,例如:
add_library(common_options INTERFACE)
target_compile_options(common_options
PUBLIC -public-flag1 -public-flag2
PRIVATE -private-flag
)
add_library(lib1 SHARED src1.cpp src2.cpp)
target_compile_options(lib1 PUBLIC -unique-flag3)
target_link_libraries(lib1 common_options)

add_library(lib2 SHARED src3.cpp src4.cpp)
target_link_libraries(lib1 common_options)

在我看来,这将是可维护性的净胜利。但是,CMake 会抛出一个错误,提示接口(interface)目标只能携带 INTERFACE选项(我无法添加 PRIVATE 选项)。有没有其他方法可以让我封装 PUBLICPRIVATE目标之间共享的标志?

最佳答案

你在正确的轨道上。考虑一下:

add_library(public  INTERFACE)
add_library(private INTERFACE)
target_compile_options(public INTERFACE -Werror)
target_compile_options(private INTERFACE -Wall)

target_link_libraries(lib1
PUBLIC # <-- public's flags will be applied to lib1 and any targets linking to lib1
public
PRIVATE # <-- private's flags will only be applied to lib1
private
)

简而言之,您忘记在对 target_link_libraries 的调用中添加范围。 .

更新 :

So I think the direct answer to my question is that I can't do exactly what I want, which would be to encompass both private and public compile option dependencies into a single entity. Instead, I just have to make a public one and a private one. Not quite as clean as what I'd hoped, but manageable.



并非如此,您将始终必须指定 PUBLICPRIVATE范围,但如果您愿意使用 target_compile_options而不是接口(interface)库来实现这一点,那么这也可以工作:
set(COMMON_FLAGS
PUBLIC
-Werror
-ffast-math
PRIVATE
-Wall
)

target_compile_options(lib1 ${COMMON_FLAGS})
target_compile_options(lib2
${COMMON_FLAGS}
PUBLIC # <-- you can still set scoped flags
-fno-fast-math
)

然而,在我看来,使用接口(interface)库并处理你必须使用 PUBLIC 的事实。和 PRIVATE从长远来看,它既干净又更易于维护。

顺便说一句,如果你想压缩 COMMON_FLAGS一行: set(COMMON_FLAGS "PUBLIC;-Werror;-ffast-math;PRIVATE;-Wall")

关于c++ - 如何在 CMake 中对目标依赖项进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60216481/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com