【问题标题】:File path with cmake add_definitions带有 cmake add_definitions 的文件路径
【发布时间】:2015-10-05 11:52:00
【问题描述】:

我正在尝试替换硬编码的预处理器

#define MY_FILE_PATH "/usr/local/myfile"

在 cmake 中使用 add_definitions

add_definitions(-DMY_FILE_PATH=${MY_FILE_PATH})

在调用 cmake 时,我使用 -DMY_FILE_PATH=/usr/tmp/myfile 但会出现各种错误,例如,'/' 标记之前的预期主表达式和 tmp 找不到等。 是否可以在我的场景中使用 add_definitions 或者我应该尝试 configure_file。 add_definitions 是否只支持整数值?

【问题讨论】:

  • 你试过用引号转义吗?
  • 是的,这是我尝试的第一件事,但同样的错误。虽然如果我用双引号回显它会正确显示它。我正在使用 zsh。

标签: cmake preprocessor add definition


【解决方案1】:

这里的答案和谷歌搜索互联网都没有对我有用(Windows 上的 CMake 3.4.1)。我终于找到了解决方案,所以你去吧,希望这对某人有所帮助:

诀窍是用add_definitions 引用您要添加的每个定义的全部内容,而不仅仅是其中的值部分,并转义将进入外壳的内部引号。请记住,每个定义都应包含一个单独的字符串。像这样:

add_definitions( "-D_SOME_DEFINE=\"Some value with spaces, etc\"" "-D DEF1=\"Another string\"")

答案不仅限于路径,还适用于您要作为预处理器指令提供的任何通用字符串。这是我能够提供包含空格字符的字符串的唯一方法。

【讨论】:

    【解决方案2】:

    不要使用add_definitions;从 CMake 3.12 开始不推荐使用它。请改用target_compile_definitions。此代码可追溯到 CMake 3.0。

    cmake_minimum_required(VERSION 3.0)
    project(example)
    
    set(MY_FILE_PATH "/usr/local/myfile")
    
    add_executable(main main.cpp)
    target_compile_definitions(main PRIVATE "MY_FILE_PATH=\"${MY_FILE_PATH}\"")
    

    如果 main.cpp 包含:

    #include <cstdio>
    
    int main () { std::puts(MY_FILE_PATH); }
    

    然后我们得到如下交互:

    dev@host:~/example$ cmake -S . -B build
    ...
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/dev/example/build
    dev@host:~/example$ cmake --build build/
    ...
    [100%] Built target main
    dev@host:~/example$ ./build/main
    /usr/local/myfile
    

    虽然总是首选使用目标属性,但如果您必须绝对使用目录属性,替换add_definitions 的函数是add_compile_definitions。你可以这样称呼它:

    add_compile_definitions("MY_FILE_PATH=\"${MY_FILE_PATH}\"")
    

    【讨论】:

      【解决方案3】:

      您的原始代码将宏定义为字符串文字,但您的 CMake 代码将其定义为一系列标记。换句话说,你去掉了引号。

      在调用 CMake 时添加它们:

      -DMY_FILE_PATH="/usr/tmp/myfile"
      

      (您可能必须为您的 shell 正确地转义它们)。

      【讨论】:

      • 到目前为止在我的 zsh $'"/usr/tmp/myfile"' 上工作的命令
      【解决方案4】:
      add_definitions(-DMY_FILE_PATH=\\"${MY_FILE_PATH}\\") 
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
      【解决方案5】:

      如果有人遇到同样的问题,我找到了正确的解决方案,此处需要引号 add_definitions(-DMY_FILE_PATH=$"{MY_FILE_PATH}") 这解决了这个问题。 之后只是 -DMY_FILE_PATH="/usr/tmp/myfile" 工作正常。

      【讨论】:

        【解决方案6】:

        在 Windows 上这对我有用:

        set(INT_TESTDATA_DIR ${CMAKE_CURRENT_SOURCE_DIR}/testdata)
        add_definitions(-DTESTDATA_DIR=R\"\(${INT_TESTDATA_DIR}\)\")
        

        TESTDATA_DIR 然后定义为:

        #define TESTDATA_DIR R"(C:/aaa/bbbb/ccc/testdata)"
        

        【讨论】:

          猜你喜欢
          • 2018-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-20
          • 1970-01-01
          • 2018-04-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多