You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 13:55:17