如何将随ExternalProject_Add一起安装的库添加到目标包含

How to add libraries installed with ExternalProject_Add to target includes

本文关键字:添加 包含 目标 安装 一起 ExternalProject Add      更新时间:2023-10-16

我正在尝试通过ExternalProject_Add将外部库包含在cmake项目中。 为了尝试此功能,我创建了一个最小的工作示例,该示例涉及使用ExternalProject_Add将 pugixml 添加到项目中。但是,我在寻找一种方法将库的头文件从外部项目的本地安装(即 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包含外部库的正确方法是什么?

不幸的是,这根本行不通。外部项目的生成是在生成时完成的,而不是在 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_Add个。然后它将与find_package一起工作。