2

我正在尝试通过 .将外部库包含到 cmake 项目ExternalProject_Add中。为了尝试这个功能,我创建了一个最小的工作示例,其中涉及将 pugixml 添加到项目中ExternalProject_Add。但是,我在寻找从外部项目的本地安装(即 pugixml 的头文件)到项目的包含路径中添加库的头文件的方法时遇到问题。

最小工作示例的项目树组织如下:

.
├── build
├── CMakeLists.txt
└── src
    ├── CMakeLists.txt
    └── main.cpp

在此项目树中,build指的是构建目录和调用 cmake 生成构建的路径。

内容./CMakeLists.txt如下:

cmake_minimum_required(VERSION 3.0)

include(ExternalProject)

ExternalProject_Add(pugixml
        GIT_REPOSITORY https://github.com/zeux/pugixml.git
        INSTALL_DIR ${PROJECT_BINARY_DIR}/extern_install/pugixml
        CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
)

add_subdirectory(src)

在上面的示例中,我将 pugixml 添加为外部项目,该项目将安装在项目的二进制目录中,其文件将由存储在./src. 因此,内容为./src/CMakeLists.txt

project(foo)

add_executable(foo main.cpp)
target_link_libraries(foo ${pugixml_LIBRARIES})
include_directories(${pugixml_INCLUDE_DIR}) # this part doesn't work

这正是我遇到问题的部分。我假设一旦添加并安装了外部项目,ExternalProject_Add就会定义一些方便的库来帮助引用库文件和包含目录。但是,这是行不通的。有谁知道使用ExternalProject_Add包含外部库的正确方法是什么?

4

1 回答 1

3

不幸的是,这根本行不通。外部项目的构建是在构建时而不是在 CMake 配置/生成期间完成的。提示是The ExternalProject_Add function creates a custom target to drive download, update/patch, configure, build, install and test steps of an external project:来自 CMake

因此,您必须自己定义所有变量。另请参阅:CMake - 链接到从 ExternalProject_add() 下载的库(我实际上将其标记为链接问题的副本,因为问题相同)

顺便说一句:我也不喜欢这样做的方式。这种方式不能简单地使用find_package等。

使用它的预期方法是“超级构建项目”:定义 1 个 CMakeLists,其中您只有ExternalProject_Adds 用于所有依赖项和您的项目。然后它将与find_package.

于 2018-08-11T15:49:00.493 回答