cmake 删除从接口库填充的编译选项

n9vozmp4  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(159)

我有一些现有的cmake文件,其中接口库用于将大量编译选项填充到另一个目标中。在我的一个目标中,我想排除这些选项中的一个,并不触及其他选项。
我尝试使用***get_target_property/set_target_property***,但很遗憾,没有找到它们正确用法
有人知道如何从***test_project***中删除选项(例如/we 4800)吗?

cmake_minimum_required (VERSION 3.8)

add_library(common_compile_options INTERFACE)
set_property(TARGET common_compile_options PROPERTY INTERFACE_COMPILE_OPTIONS 
            /we4309
            /we4800
)

add_executable (test_project "main.cpp")
target_link_libraries(test_project common_compile_options)

====更新1====:
我试了试也跟着变通:

cmake_minimum_required (VERSION 3.8)

add_library(common_compile_options INTERFACE)
set_property(TARGET common_compile_options PROPERTY INTERFACE_COMPILE_OPTIONS 
            /we4309
            /we4800
)
get_target_property(CACHE_PROPERTY common_compile_options INTERFACE_COMPILE_OPTIONS)
string(REPLACE "/we4800" "" TEMP_PROPERTY "${CACHE_PROPERTY}")

add_executable (project "main.cpp")

target_link_libraries(project common_compile_options)
set_property(TARGET project PROPERTY COMPILE_OPTIONS ${TEMP_PROPERTY})

get_target_property(PROJECT_PROPERTY project COMPILE_OPTIONS)
message("New properties: "   ${PROJECT_PROPERTY})

在cmake输出中,我得到了预期的消息:

New properties: /we4309

但是/we 4800选项仍然传递给编译器:(

hsvhsicv

hsvhsicv1#

我找到了可行的解决方案,但问题是,它会在所有情况下都有效吗?

cmake_minimum_required (VERSION 3.8)

add_library(common_compile_options INTERFACE)
set_property(TARGET common_compile_options PROPERTY INTERFACE_COMPILE_OPTIONS 
            /we4309
            /we4800
)

add_executable (project "main.cpp")

target_link_libraries(project common_compile_options)

set_source_files_properties(main.cpp 
    DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
    PROPERTIES COMPILE_OPTIONS /wd4800
)

相关问题