代码之家  ›  专栏  ›  技术社区  ›  einpoklum

来自#cmakedefine替换的意外结果

  •  1
  • einpoklum  · 技术社区  · 7 年前

    假设在我的 CMakeLists.txt 我有:

    check_function_exists(getopt HAVE_GETOPT)
    configure_file(config.h.in config.h @ONLY)
    

    并且在 config.h.in 我有:

    #cmakedefine HAVE_GETOPT @HAVE_GETOPT@
    #cmakedefine STDLIB_HAS_GETOPT @HAVE_GETOPT@
    

    我希望看到

    #define HAVE_GETOPT 1
    #define STDLIB_HAS_GETOPT 1
    

    传球后。相反,我得到:

    #define HAVE_GETOPT 1 
    /* #undef STDLIB_HAS_GETOPT */
    

    为什么行为上有差异?

    笔记:

    • 使用cMake v3.5.1和GNU/Linux Mint 18.3以及内核4.10。
    3 回复  |  直到 7 年前
        1
  •  4
  •   usr1234567    7 年前

    要获得所需的行为,请不要使用 cmakedefine ,但使用 cmakedefine01 相反(请注意尾部 01 ). 在您的示例中:

    #cmakedefine01 HAVE_GETOPT @HAVE_GETOPT@
    #cmakedefine01 STDLIB_HAS_GETOPT @HAVE_GETOPT@
    

    文档: https://cmake.org/cmake/help/latest/command/configure_file.html

        2
  •  1
  •   usr1234567    7 年前

    对于 #cmakedefine 不能在第二个参数中使用不同的变量,而不能在第一个参数中使用不同的变量。你必须定义 STDLIB_HAS_GETOPT 运行前 configure_file .

    check_function_exists(getopt HAVE_GETOPT)
    set(STDLIB_HAS_GETOPT HAVE_GETOPT)
    configure_file(config.h.in config.h @ONLY)
    
        3
  •  0
  •   Tsyvarev    7 年前

    Documentation 对于 configure_file 很清楚:


    ... 表单的输入行:

    #cmakedefine VAR ...
    

    将替换为:

    #define VAR ...
    

    或:

    /* #undef VAR */
    

    取决于是否在CMake中设置VAR。。。


    仅值 风险值 有一种感觉,一切之后都与CMake无关 #define #undef .

    因此, #cmakedefine HAVE_GETOPT 已转换为 #定义 但是 #cmakedefine STDLIB_HAS_GETOPT 已转换为 #未定义 (自变量 STDLIB\u HAS\u GETOPT 未在CMake代码中设置)。