未知的 CMake 命令 "ExternalProject_Add"

32

我有以下的 CMakeLists.txt 文件:

cmake_minimum_required (VERSION 3.2 FATAL_ERROR)

project (utils VERSION 1.0.0 LANGUAGES CXX)

ExternalProject_Add(json-c
    GIT_REPOSITORY "https://github.com/json-c/json-c.git"
    UPDATE_COMMAND git pull "https://github.com/json-c/json-c.git"

    CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/SDL_image/./configure
                      --prefix=${SDL_INSTALL_DIR}

    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/json-c

    INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}
    )

我想在我的项目中添加json-c库,但是当我运行cmake时,遇到错误:未知的CMake命令“ExternalProject_Add”。我的OS X上的CMake版本是3.6.2。


6
你错过了 include(ExternalProject) 的部分吗? - usr1234567
2个回答

45
在v3.14之前的文档页面中,虽然没有直接写明,但在cmake-modules部分描述的CMake函数需要包括特定模块。由于函数ExternalProject_Add在标题为“ExternalProject”的文档页面中描述,因此您需要使用该函数。
include(ExternalProject)

在使用之前。


同样的策略适用于除了Find<name>模块以外的任何其他模块。那些模块是通过

find_package(<name>)

4
如果有人感到困惑,ExternalProject并不是一个变量,比如“my_c_project”。你必须字面上包含“ExternalProject”。 - Code Wiget
3
“虽然文档页面中没有直接写明” - 哦,太好了,我越来越喜欢CMake了。当开发人员不能费心将所需步骤包含在文档中时,使用它真是太棒了... - Tustin2121
@Tustin2121 这些模块与cmake一起提供,但是它们是普通的cmake文件,必须像其他外部cmake文件一样包含到CMakeLists.txt中。从v3.14开始,有人扩展了文档。 - Th. Thielemann

36

所需的模块应该是您的CMake安装的一部分。但是,您需要使用以下方式将其包含到您的项目中:

include(ExternalProject)

在调用externalproject_add(YOUR STUFF HERE)之前,请参阅模块

有两种包含变体:

include(<MODULE_NAME_WITHOUT_.cmake>)
include(<FULL_PATH_TO_MODULE_WITH_.cmake>)

示例:

include(gcovr)
include(${PROJECT_DIR}/cmake/gcovr.cmake)

模块是普通的 cmake 文件,必须像你自己的模块文件一样包含它们(如果你有这些文件)。

变量CMAKE_MODULE_PATH是一个列表,包含 cmake 加载模块的所有目录。你可以通过以下方式打印出当前值:

message(STATUS "CMAKE_MODULE_PATH=${CMAKE_MODULE_PATH}") 

或者你可以使用智能宏来实现。请参见CMake


2
它对我不起作用:include could not find load file: ExternalProject.cmake。但是按照@Tsyvarev的答案精确地使用include(ExternalProject)可以解决问题。 - BernardK

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