如何在CMake中打印变量?

25

我想使用cmake构建我的项目,我的CMakeLists.txt文件非常简单:

cmake_minimum_required(VERSION 3.20)

 project(YuvParallelProcess)

 message("$(PROJECT_SOURCE_DIR)")

 include_directories($(PROJECT_SOURCE_DIR)/inc)
 link_directories($(PROJECT_SOURCE_DIR)/lib/libyuv)

 add_executable(YuvParallelProcess  $(PROJECT_SOURCE_DIR)/src/main.cpp)

 target_link_libraries(YuvParallelProcess  libyuv.a)

我的项目文件按照以下方式组织:

 YuvParallelProcess
                      build
                      data
                      inc
                      lib
                      src
                      CMakeLists.txt

当我在build目录下运行cmake ..命令时,终端会输出以下信息:

$(PROJECT_SOURCE_DIR)
-- Configuring done
CMake Error at CMakeLists.txt:10 (add_executable):
  Cannot find source file:

    $(PROJECT_SOURCE_DIR)/src/main.cpp


CMake Error at CMakeLists.txt:10 (add_executable):
  No SOURCES given to target: YuvParallelProcess

我不知道为什么shell只打印出$(PROJECT_SOURCE_DIR)而不是PROJECT_SOURCE_DIR的值。如何打印出PROJECT_SOURCE_DIR的值呢?另外,我弄不清楚为什么cmake无法编译我的项目。


1
除了下面的答案之外:在大多数情况下,您不需要使用绝对路径,如果您这样做,最好使用CMAKE_CURRENT_SOURCE_DIR,因为它引用包含当前CMakeLists.txt文件的目录,无论是否有project()命令;在更复杂的项目中,您可以在子目录中省略此命令。此外,我建议将包含/链接目录定义限制在需要它们的地方,并使用target_include_directories/target_link_directories - fabian
2个回答

35

Cmake使用花括号获取变量的值:

${PROJECT_SOURCE_DIR}

我建议不要跳过空消息,可以像下面这样删除这些消息。

message(PROJECT_SOURCE_DIR="${PROJECT_SOURCE_DIR}")

Cmake未能配置您的项目,因为它无法识别括号中的变量,并将$(PROJECT_SOURCE_DIR)视为字符串文字。

有一个名为CMakePrintHelpers的CMake模块,可以精确地转储变量,就像上面一样。

include(CMakePrintHelpers)
cmake_print_variables(PROJECT_SOURCE_DIR)

20

除了使用message,您还可以使用cmake_print_variables来显示变量。

在这种情况下,您必须包括CMakePrintHelpers

include(CMakePrintHelpers)

cmake_print_variables(PROJECT_SOURCE_DIR)

输出结果将是:

-- PROJECT_SOURCE_DIR="path/to/your/project"

使用cmake_print_variables,您还可以显示多个变量,如下所示:

cmake_print_variables(PROJECT_SOURCE_DIR ANOTHER_VARIABLE)

输出结果将为:

-- PROJECT_SOURCE_DIR="path/to/your/project" ; ANOTHER_VARIABLE="other variable"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接