c++ 如何使用目标接口向CMake FetchContent依赖项添加编译选项

7uzetpgm  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(161)

我使用CMake的FetchContent包含了一个依赖项,需要使用一些构建标志(cmake -DFLAG=ON)来构建它。
这个问题在here中也会被问到,提供的答案似乎是使用set在当前作用域上设置一个变量,例如set(FLAG ON)
我的问题:* * 是否有一种方法可以在不污染示波器的情况下实现相同的效果?**
我尝试过使用set_target_propertiestarget_compile_options,但没有成功。如果我在FetchContent_MakeAvailable之后调用它们,它们将不起作用,如果我在之前调用它们,则目标将不存在,并抛出错误。

include(FetchContent)
FetchContent_Declare(
    Dependency
    GIT_REPOSITORY ...
    GIT_TAG ...
)

set(FLAG ON) # This works, but pollutes the scope. I only want this flag to take effect on "Dependency"

# set_target_properties(Dependency PROPERTIES FLAG ON) # This won't work (error)
# target_compile_options(Dependency PUBLIC -DFLAG=ON) # This won't work either (error)

FetchContent_MakeAvailable(Dependency)

# set_target_properties(Dependency PROPERTIES FLAG ON) # This has no effect
# target_compile_options(Dependency PUBLIC -DFLAG=ON) # This has no effect
4uqofj5v

4uqofj5v1#

我不知道这应该是一个回答还是一个评论,但是您可以使用以下模式来避免污染范围:

set(CMAKE_CXX_FLAGS_OLD "${CMAKE_CXX_FLAGS}")

# Add other flags here.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-restrict")

FetchContent_MakeAvailable(gflags)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_OLD}")

相关问题