如何阻止CMake修改指定的include目录路径?
解决CMake在MSYS2中自动给路径添加当前目录前缀的问题
问题根源是:在MSYS2的Unix Makefiles生成器模式下,CMake会将Windows风格的绝对路径(如D:/xxx)误判为相对路径——因为Unix体系下的绝对路径是以/开头的,所以CMake自动给这类路径拼接了当前工作目录前缀,导致路径失效。
两种可行的解决方法
方法一:直接使用MSYS2的Unix风格路径
MSYS2会把Windows的盘符挂载到/mnt/目录下,比如D:对应/mnt/d/,直接把路径改成Unix格式即可:
修改CMakeLists.txt中的路径定义:
cmake_minimum_required(VERSION 3.13) SET(CMAKE_INCLUDE_CURRENT_DIR ON) project(my_project) message("PROJECT_NAME is '${PROJECT_NAME}'") # 使用MSYS2识别的Unix风格绝对路径 set(my_incls "/mnt/d/msys64/usr/include" "/mnt/d/msys64/usr/lib/glib-2.0/include") message("my_incls ${my_incls}") add_library(test main.c) target_include_directories(test PRIVATE ${my_incls}) get_target_property(libincl test INCLUDE_DIRECTORIES) message("libincl ${libincl}")
方法二:在CMake中自动转换Windows路径为Unix格式
如果需要保留Windows路径的写法,可以通过cygpath工具(MSYS2自带)自动转换路径:
cmake_minimum_required(VERSION 3.13) SET(CMAKE_INCLUDE_CURRENT_DIR ON) project(my_project) message("PROJECT_NAME is '${PROJECT_NAME}'") # 原始Windows风格路径 set(my_win_incls "D:/msys64/usr/include" "D:/msys64/usr/lib/glib-2.0/include") set(my_incls "") # 遍历路径,用cygpath转换为Unix格式 foreach(path ${my_win_incls}) execute_process( COMMAND cygpath -u "${path}" OUTPUT_VARIABLE unix_path OUTPUT_STRIP_TRAILING_WHITESPACE ) list(APPEND my_incls "${unix_path}") endforeach() message("my_incls ${my_incls}") add_library(test main.c) target_include_directories(test PRIVATE ${my_incls}) get_target_property(libincl test INCLUDE_DIRECTORIES) message("libincl ${libincl}")
验证效果
修改后重新执行CMake命令,libincl输出的路径会是正确的Unix风格绝对路径,不会再被添加当前目录前缀。
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

