【问题标题】:Displaying CMake variables显示 CMake 变量
【发布时间】:2015-09-29 09:10:54
【问题描述】:

假设我有一个名为 Foo 的包。如果我在包含 find_package(Foo) 的 CMakeLists.txt 文件上运行 CMake,那么我可以打印出变量的值,例如 ${Foo_LIBRARIES}${Foo_INCLUDES}

有没有一种简单的方法来显示这些变量,而无需在 CMakeLists.txt 文件上运行 CMake,也无需手动检查 config.cmake 文件?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    您问:(1) 有没有一种简单的方法可以显示这些变量,而无需对 CMakeLists.txt 文件运行 cmake,以及 (2) 无需手动检查 config.cmake 文件?

    对于 (2),我可以给你一个肯定的答案,但它确实需要你(重新)运行 cmake。但是由于您可以通过简单地在构建目录中执行 cmake . 来重新运行您的 cmake 配置步骤,因此重新运行 cmake 不应阻止您尝试这种方法。我的答案在这个SO answer 中给出,并使用get_cmake_property 命令。这是封装到 cmake 宏中的代码,print_all_variables,所以我可以在调试我的 cmake 脚本时使用它。

    macro(print_all_variables)
        message(STATUS "print_all_variables------------------------------------------{")
        get_cmake_property(_variableNames VARIABLES)
        foreach (_variableName ${_variableNames})
            message(STATUS "${_variableName}=${${_variableName}}")
        endforeach()
        message(STATUS "print_all_variables------------------------------------------}")
    endmacro()
    

    使用与 cmake 函数相同的语法调用宏:

    print_all_variables()
    

    【讨论】:

      【解决方案2】:

      要简单地打印一个值,您可以执行以下操作:

      message(STATUS "foo include dir: ${foo_INCLUDE}")
      

      ${foo_INCLUDE} 是您想要打印的值。

      注意:我使用的是 cmake > 3.14

      【讨论】:

        【解决方案3】:

        在查找包模式下运行cmake。显示包的包含目录的示例:

        cmake -DNAME=ZLIB -DCOMPILER_ID=GNU -DLANGUAGE=C -DMODE=COMPILE --find-package
        

        显示库的示例:

        cmake -DNAME=ZLIB -DCOMPILER_ID=GNU -DLANGUAGE=C -DMODE=LINK --find-package
        

        NAME 必须设置为包名。您可以在this page 上获取您的COMPILER_IDLANGUAGE 可以是CCXXFortran

        【讨论】:

        • 我喜欢这个主意,但它似乎不适合我:$ uname -a Linux kaveri 4.18.0-16-generic #17-Ubuntu SMP Fri Feb 8 00:06:57 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux $ ls /usr/lib/x86_64-linux-gnu/cmake/assimp-4.1/ assimp-config.cmake assimp-config-version.cmake $ cmake -DNAME=assimp-4.1 -DCOMPILER_ID=GNU -DLANGUAGE=CXX -DMODE=LINK --find-package assimp-4.1 not found. CMake Error: Problem processing arguments. Aborting.
        • 包名是assimp,试试-DNAME=assimp
        • 我仍然得到相同的响应:assimp not found 等等。
        【解决方案4】:

        运行 CMake 并使用ccmake GUI 工具查看缓存。然后你会得到所有的变量。

        或使用 -LH 运行CMake,然后您将在配置后打印所有变量。

        所以我认为不运行 CMake 就无法获取变量。

        【讨论】:

        • 这很棒。 -LH 无点
        【解决方案5】:

        这些变量通常被硬编码到 FindFoo.cmake 中,因此如果不先运行函数就无法提取它们。请注意,有时 Foo_LIBRARIES 的值取决于系统配置,在运行 find_package(Foo) 之前是未知的。

        【讨论】:

          猜你喜欢
          • 2018-05-07
          • 2010-11-12
          • 1970-01-01
          • 2014-09-16
          • 2020-06-08
          • 1970-01-01
          • 2020-08-23
          • 1970-01-01
          • 2015-06-28
          相关资源
          最近更新 更多