我们阅读vcpkg安装的abseil的absTargets.cmake,会发现类似下面的代码
set_target_properties(absl::nullability PROPERTIES
INTERFACE_COMPILE_FEATURES "cxx_std_17"
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
INTERFACE_LINK_LIBRARIES "absl::config;absl::core_headers;-ignore:4221"
)
INTERFACE_LINK_LIBRARIES 中有-ignore:4221,我们要在clang的情况下移除-ignore:4221以及前面的分号
下面的代码完成了这个操作,修改了某项属性这样就可以在windows下,clang编译器可以连接absl了
if(WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
foreach(target absl::base absl::strings)
if(TARGET ${target})
get_target_property(opts ${target} INTERFACE_LINK_LIBRARIES)
if(opts)
# opts 是一个列表,把它拼成字符串再替换
string(REPLACE ";-ignore:4221" "" cleaned_opts "${opts}")
# 再拆回列表
separate_arguments(cleaned_opts)
set_target_properties(${target} PROPERTIES INTERFACE_LINK_LIBRARIES "${cleaned_opts}")
message(STATUS "Cleaned INTERFACE_LINK_LIBRARIES for ${target}: ${cleaned_opts}")
endif()
endif()
endforeach()
endif()
评论区