路径含空格致Windres编译错误,求MinGW+Qt6+CMake环境非改路径方案
解决MinGW+Qt6+CMake+Ninja路径空格导致的cc1.exe查找错误
问题根源是带空格的路径(C:\Program Files\somelib)在传递给cc1.exe时未被正确转义,被拆分为C:\Program和Files/somelib,以下是无需修改库路径的替代方案:
方案1:使用Windows短路径(8.3格式)
Windows对包含空格的目录自动生成短路径(8个字符以内的缩写),可通过命令行获取:
dir /x "C:\Program Files"
通常Program Files的短路径是Progra~1,之后在CMakeLists.txt中用短路径指定库路径:
set(SOMELIB_ROOT "C:/Progra~1/somelib") include_directories(${SOMELIB_ROOT}/include) link_directories(${SOMELIB_ROOT}/lib)
方案2:CMake中用双引号包裹路径并统一分隔符
配置库路径时用双引号包裹完整路径,同时将反斜杠改为正斜杠(或转义反斜杠),确保CMake生成的构建脚本中路径不会被拆分:
# 正斜杠写法 set(SOMELIB_INCLUDE_DIR "C:/Program Files/somelib/include") set(SOMELIB_LIB_DIR "C:/Program Files/somelib/lib") # 或转义反斜杠写法 # set(SOMELIB_INCLUDE_DIR "C:\\Program Files\\somelib\\include") include_directories(${SOMELIB_INCLUDE_DIR}) link_directories(${SOMELIB_LIB_DIR})
方案3:直接在编译Flags中添加带引号的路径
手动将包含路径用引号包裹后添加到CMAKE_C/CXX_FLAGS中,强制cc1.exe识别完整路径:
# 针对C++ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I\"C:/Program Files/somelib/include\"") # 针对C set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I\"C:/Program Files/somelib/include\"") # 链接库时同理 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L\"C:/Program Files/somelib/lib\" -lsomelib")
方案4:自定义命令时启用VERBATIM选项
如果项目中有自定义编译命令,添加VERBATIM选项让CMake自动处理参数转义,适配Ninja的执行规则:
add_custom_command( OUTPUT my_target.o COMMAND ${CMAKE_CXX_COMPILER} -c src/my_file.cpp -I"C:/Program Files/somelib/include" VERBATIM )
VERBATIM会确保所有参数按平台正确转义,避免空格拆分问题。
内容的提问来源于stack exchange,提问作者Killlin
相关产品推荐
相关产品推荐

