在CMake中,我有以下代码段:
set(FILE_PATH "" CACHE STRING "Full path of the file")
add_definitions(-DFILE_PATH="${DATA_SET_PATH}")
在C ++代码中,我有这个片段:
std::string my_file_path = std::string(FILE_PATH);
除了这种情况外,哪种方法效果很好: 如果在MS Windows上有一个并将文件路径复制到CMake GUI,如下所示:
C:\nnn.txt
__^____
而不是:
C:/nnn.txt
__^____
或:
C:\\nnn.txt
__^^___
由于转义字符会导致问题。
除了告诉开发人员注意“\ thing”之外,我还有什么选择来解决这个问题?
我想用\
替换所有单曲/
,但我意识到没有任何名为单\
的内容,如果注入单\
则无法搜索在字符串中为单\
而不是双\\
。
答案 0 :(得分:2)
以下是CMake方面的一些评论/解决方案
您应该使用FILEPATH
代替STRING
缓存类型
set(FILE_PATH "" CACHE FILEPATH "Full path of the file")
来自set()
command documentation:
FILEPATH
:磁盘上文件的路径。 cmake-gui(1)提供了一个文件对话框。
这会在缓存条目的末尾添加小...
按钮:
您应该将政策CMP0005
: Preprocessor definition values are now escaped automatically设置为NEW
cmake_policy(SET CMP0005 NEW)
如果用户手动粘贴包含反斜杠的文件路径,那将处理正确的转义。
您可以使用file()
命令规范化路径,如:
set(FILE_PATH "" CACHE FILEPATH "Full path of the file")
file(TO_CMAKE_PATH "${FILE_PATH}" FILE_PATH_NORMALIZED)
add_definitions(-DFILE_PATH="${FILE_PATH_NORMALIZED}")
<强>参考强>
答案 1 :(得分:1)
您是否正在寻找config.h.in
方法和configure_file()
CMake电话?
此外,C ++ 11及更高版本中还有原始字符串文字,因此R"(c:\n.txt)"
实际上与"c:\\n.txt"
相同。