c++ - 来自 CMake 的文件路径作为 C++ 中的字符串

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

我想用 / 替换所有单曲 \ 但我意识到没有什么叫做单曲 \ 并且你不能搜索单曲\ 如果它作为单个 \ 而不是双 \\ 注入(inject)到字符串中。

顺便说一句,非常感谢任何解决此问题的方法,即使它是在 CMake 级别而不是 C++ 代码级别。

最佳答案

这里有一些关于CMake方面的评论/解决方案

  1. 您应该使用 FILEPATH 而不是 STRING 缓存类型

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

    来自set() command documentation :

    FILEPATH : Path to a file on disk. cmake-gui(1) offers a file dialog.

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

    enter image description here

  2. 你应该设置策略 CMP0005: Preprocessor definition values are now escaped automaticallyNEW

    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}")
    

引用资料

关于c++ - 来自 CMake 的文件路径作为 C++ 中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48847771/

相关文章:

c++ - 类型转换结构和类

c++ - 从 2 个列表小部件拖放,但在放入第二个 QListWidget 后更改文本

Python - 打开文件 - readline - 列表 - 转换为字符串

c++ - CMake 没有将共享库的链接依赖项传播到我的可执行文件

c++ - 未初始化的 std::optional 或 boost::optional 构造函数可以抛出吗?

c++ - 如何从 Little-Endian UTF-16 编码字节中获取 C++ std::string

java - Android Studio 从所有 Activity 中获取字符串

c++11 - CMake: ‘sqrtf’ 不是 ‘std’ 的成员

c++ - 如何为这个项目使用现代 cmake

c++ - 需要解释 C++ 代码