如何防止CMake覆盖同一路径的-I标志,使其同时保留-I与-isystem?
解决CMake中同一路径同时保留-I和-isystem标志的问题
首先得说清楚为啥你遇到的情况会被覆盖:CMake在处理target_include_directories的时候,会对同一个目标下的重复路径做去重处理,而且会保留最后一次设置的路径属性——你第二次用SYSTEM PUBLIC设置了pathA,就直接覆盖了第一次普通的PUBLIC设置,自然只会看到-isystem标志。
想要让同一个路径同时以-I和-isystem出现在编译命令里,得绕过CMake的路径去重机制,直接给目标手动添加编译选项就行,具体做法如下:
add_library(lib SHARED libSource.cpp) # 先添加普通的-I路径(通过CMake的标准接口管理) target_include_directories(lib PUBLIC pathA) # 手动添加-isystem的编译选项,绕过CMake的去重 target_compile_options(lib PUBLIC -isystem pathA)
如果你的项目只针对C++,也可以加上语言过滤,避免影响C代码编译:
target_compile_options(lib PUBLIC $<$<COMPILE_LANGUAGE:CXX>:-isystem pathA>)
这样设置之后,运行make VERBOSE=1查看编译命令,就能同时看到-IpathA和-isystem pathA两个标志了。
核心原因是:target_compile_options只是单纯把你指定的参数传递给编译器,不会做路径去重或属性覆盖;而target_include_directories是CMake用来统一管理依赖路径、传递性等逻辑的接口,所以会有去重和属性覆盖的行为。
内容的提问来源于stack exchange,提问作者Alpha234
相关产品推荐
相关产品推荐

