CMake中的文件路径为C ++中的字符串

时间:2018-02-18 02:03:36

标签: c++ string cmake

在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”之外,我还有什么选择来解决这个问题?

我想用\替换所有单曲/,但我意识到没有任何名为单\的内容,如果注入单\则无法搜索在字符串中为单\而不是双\\

顺便说一句,任何解决这个问题的方法都非常受欢迎,即使它是在CMake级别而不是C ++代码级别。

2 个答案:

答案 0 :(得分:2)

以下是CMake方面的一些评论/解决方案

  1. 您应该使用FILEPATH代替STRING缓存类型

    set(FILE_PATH "" CACHE FILEPATH "Full path of the file")
    

    来自set() command documentation

      

    FILEPATH:磁盘上文件的路径。 cmake-gui(1)提供了一个文件对话框。

    这会在缓存条目的末尾添加小...按钮:

    enter image description here

  2. 您应该将政策CMP0005: Preprocessor definition values are now escaped automatically设置为NEW

    cmake_policy(SET CMP0005 NEW)
    

    如果用户手动粘贴包含反斜杠的文件路径,那将处理正确的转义。

  3. 您可以使用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}")
    
  4. <强>参考

答案 1 :(得分:1)

您是否正在寻找config.h.in方法和configure_file() CMake电话?

此外,C ++ 11及更高版本中还有原始字符串文字,因此R"(c:\n.txt)"实际上与"c:\\n.txt"相同。