cmake在Windows上使用\作为转义序列产生错误

man*_*ans 4 c++ windows cmake

我的cmake中有这样的内容:

set(MyLib_SRC $ENV{MyLib_DIR}/MyLib.cpp)
add_library(MyLibrary STATIC ${MyLib_SRC})
Run Code Online (Sandbox Code Playgroud)

但是当我运行cmake时,出现此错误:

CMake Warning (dev) at CMakeLists.txt:97 (add_library):
Syntax error in cmake code when parsing string

D:\New\Development\Lib/myLib.cpp

Invalid escape sequence \N

Policy CMP0010 is not set: Bad variable reference syntax is an error.  Run
"cmake --help-policy CMP0010" for policy details.  Use the cmake_policy
command to set the policy and suppress this warning.
This warning is for project developers.  Use -Wno-dev to suppress it.
Run Code Online (Sandbox Code Playgroud)

我读了这个OS答案cmake分析错误:无效的转义序列\ o,但是如何将宏(哪个宏!)更改为函数?

env变量的值为

MyLib_DIR=D:\New\Development\Lib
Run Code Online (Sandbox Code Playgroud)

Rei*_*ica 7

问题在于$ENV{MyLib_DIR}逐字扩展了环境变量,包括用作路径分隔符的反斜杠。然后可以将这些重新解释为转义序列。

您要做的是在使用CMake代码处理之前,将路径转换为CMake的内部格式:

file(TO_CMAKE_PATH $ENV{MyLib_DIR} MyLib_DIR)

set(MyLib_SRC ${MyLib_DIR}/MyLib.cpp)
add_library(MyLibrary STATIC ${MyLib_SRC})
Run Code Online (Sandbox Code Playgroud)


squ*_*les 6

正如 Angew 的回答所示,环境变量中的反斜杠被解释为转义序列。从 CMake 3.20 开始,该命令提供了许多路径操作工具cmake_path。使用该SET选项,此命令会将输入转换为带有正斜杠 ( /) 的 CMake 路径:

cmake_path(SET MyLib_SRC $ENV{MyLib_DIR}/MyLib.cpp)
add_library(MyLibrary STATIC ${MyLib_SRC})
Run Code Online (Sandbox Code Playgroud)

MyLib_SRC变量现在将包含正斜杠:

D:/New/Development/Lib/MyLib.cpp
Run Code Online (Sandbox Code Playgroud)