如何在CMake中对同一路径同时使用-isystem与-I参数?
解决CMake中同一路径同时使用-I和-isystem的问题
你遇到的问题其实是CMake的默认行为导致的:target_include_directories会自动对相同的包含路径去重,而且当你用SYSTEM标记某个路径后,后续对同一路径的普通设置会被覆盖,所以两次调用后最终只会保留-isystem pathA。要实现同时添加-IpathA和-isystem pathA,得绕过CMake的路径管理逻辑,直接手动指定编译选项。
具体做法
不用target_include_directories,改用target_compile_options直接传入两个编译标志:
add_library(lib SHARED libSource.cpp) # 直接添加两个编译选项,绕过CMake的路径去重 target_compile_options(lib PRIVATE -IpathA -isystem pathA )
原理说明
target_compile_options不会对传入的参数做去重或优先级调整,它会原封不动地把这些标志传递给编译器,这样就能同时得到你需要的-IpathA和-isystem pathA两个构建参数。
额外提示
- 如果你需要让这些编译标志被依赖当前库的其他目标继承,把
PRIVATE替换成PUBLIC或INTERFACE(根据你的项目依赖关系选择)。 - 为了避免路径解析问题,推荐使用绝对路径,比如
${CMAKE_CURRENT_SOURCE_DIR}/pathA来替代相对路径pathA。
内容的提问来源于stack exchange,提问作者Alpha234
相关产品推荐
相关产品推荐

