如何将随ExternalProject_Add安装的库添加到目标包括

时间:2018-08-11 15:40:39

标签: c++ cmake external-project

我正在尝试通过<title id="page-title"></title> <div class="div-container"> <div class="container"> <p class="info">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed euismod nisi porta lorem mollis aliquam. Aliquam faucibus purus in massa tempor. Enim neque volutpat ac tincidunt. At quis risus sed vulputate odio ut enim blandit volutpat.</p> </div> <div class="div-container"> <h2 class="h2">Sample</h2> <p class="p2">P2</p> <p class="p3">p3</p> <p id="p4"></p> </div> </div>将外部库包含到cmake项目中。为了试用此功能,我创建了一个最小的工作示例,其中涉及使用ExternalProject_Add将pugixml添加到项目中。但是,我在从项目的包含路径中从外部项目的本地安装(即pugixml的标题)中添加库的头文件的方法中遇到了问题。

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

ExternalProject_Add

在此项目树中,. ├── build ├── CMakeLists.txt └── src ├── CMakeLists.txt └── main.cpp 指向构建目录和调用cmake生成构建的路径。

build的内容如下:

./CMakeLists.txt

在上面的示例中,我添加了pugixml作为要安装在项目二进制目录中的外部项目,该文件的文件将由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) 中存储的可执行文件使用。因此,./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包含外部库的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

不幸的是,这根本不起作用。外部项目的构建是在构建时完成的,而不是在CMake配置/生成过程中完成的。提示是The ExternalProject_Add function creates a custom target to drive download, update/patch, configure, build, install and test steps of an external project:from CMake

因此,您将必须自行定义所有变量。另请参阅:CMake - linking to library downloaded from ExternalProject_add()(由于问题相同,我实际上将其标记为链接问题的重复项)

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

使用此方法的预期方式是“超级构建项目”:定义1个CMakeList,其中对于所有依赖项和项目,您只有ExternalProject_Add个。然后它将与find_package一起使用。