Windows下CMake用Unix Makefiles编译时路径错误问题求助
在Windows环境下使用MSYS UCRT64、VSCode和CMake的Unix Makefiles生成器构建C项目时,首次编译正常,但修改代码后二次执行make命令会出现src/lib/CMakeFiles/libhangman.dir/compiler_depend.make:4: *** multiple target patterns. Stop.错误,原因是生成的makefile中混入了Windows格式绝对路径(如C:/...),导致GNU Make解析时将冒号识别为目标分隔符引发冲突。
以下是具体解决方案:
强制在MSYS UCRT64 Shell中执行构建命令
不要在Windows原生CMD或PowerShell中运行CMake和make,必须打开MSYS UCRT64的终端窗口,进入项目build目录执行命令。MSYS会自动将Windows路径转换为Unix风格(如/c/...),避免make解析路径出错。修改CMake配置,生成Unix风格路径
在项目根目录的CMakeLists.txt最开头添加以下配置,强制CMake使用相对路径或Unix风格绝对路径:# 生成相对路径,避免硬编码Windows绝对路径 set(CMAKE_USE_RELATIVE_PATHS ON) # 跳过安装依赖检查,减少路径相关生成逻辑 set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY ON)同时,确保所有路径引用都使用CMake内置变量(如
CMAKE_SOURCE_DIR、CMAKE_CURRENT_SOURCE_DIR),避免硬编码Windows路径。例如:# 推荐写法 add_library(libhangman STATIC ${CMAKE_CURRENT_SOURCE_DIR}/utils.c ${CMAKE_CURRENT_SOURCE_DIR}/game_logic.c ) # 禁止硬编码Windows路径 # add_library(libhangman STATIC C:/project/src/lib/utils.c)清理现有构建目录,重新生成Makefile
进入build目录,清理旧的生成文件后重新运行CMake:rm -rf build/* cd build cmake -G "Unix Makefiles" ..这一步确保生成的Makefile完全使用MSYS环境下的Unix风格路径。
配置VSCode使用MSYS Shell执行构建任务
如果通过VSCode的构建任务执行make,需在.vscode/tasks.json中指定使用MSYS UCRT64的shell:{ "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "command": "make", "args": [], "options": { "shell": { "executable": "C:/msys64/ucrt64.exe", "args": ["-c"] } }, "group": { "kind": "build", "isDefault": true }, "problemMatcher": ["$gcc"] } ] }替换
executable路径为你本地MSYS UCRT64的安装路径。
内容的提问来源于stack exchange,提问作者Durian Sosa

