gpt4 book ai didi

cmake - 将 Boost 构建为 ExternalProject_Add 并使用 FindBoost 或导出结果

转载 作者:行者123 更新时间:2023-12-01 03:19:24 25 4
gpt4 key购买 nike

我有许多外部依赖项,我想通过 ExternalProject_Add 加入到我的项目中.诀窍是尽可能以最干净的方式导出包含目录和生成的静态链接库。
是否可以制作FindBoost依赖于 ExternalProject_Add或者至少让项目使用 target_link_libraries 拉入库和头文件?
促进

include( ExternalProject )

set( boost_URL "http://sourceforge.net/projects/boost/files/boost/1.63.0/boost_1_63_0.tar.bz2" )
set( boost_SHA1 "9f1dd4fa364a3e3156a77dc17aa562ef06404ff6" )
set( boost_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/third_party/boost )
set( boost_INCLUDE_DIR ${boost_INSTALL}/include )
set( boost_LIB_DIR ${boost_INSTALL}/lib )

ExternalProject_Add( external_boost
PREFIX boost
URL ${boost_URL}
URL_HASH SHA1=${boost_SHA1}
BUILD_IN_SOURCE 1
CONFIGURE_COMMAND ./bootstrap.sh
--with-libraries=filesystem
--with-libraries=system
--with-libraries=date_time
--prefix=<INSTALL_DIR>
BUILD_COMMAND
./b2 install link=static variant=release threading=multi runtime-link=static
INSTALL_COMMAND ""
INSTALL_DIR ${boost_INSTALL} )

set( boost_LIBRARY_SUFFIX .a )

add_library( boost::date_time STATIC IMPORTED )
set_property( TARGET boost::date_time PROPERTY IMPORTED_LOCATION ${boost_LIB_DIR}/libboost_date_time${boost_LIBRARY_SUFFIX} )
set_property( TARGET boost::date_time PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${boost_INCLUDE_DIR} )
add_dependencies( boost::date_time external_boost )

add_library( boost::system STATIC IMPORTED )
set_property( TARGET boost::system PROPERTY IMPORTED_LOCATION ${boost_LIB_DIR}/libboost_system${boost_LIBRARY_SUFFIX} )
set_property( TARGET boost::system PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${boost_INCLUDE_DIR} )
add_dependencies( boost::system external_boost )

add_library( boost::filesystem STATIC IMPORTED )
set_property( TARGET boost::filesystem PROPERTY IMPORTED_LOCATION ${boost_LIB_DIR}/libboost_filesystem${boost_LIBRARY_SUFFIX} )
set_property( TARGET boost::filesystem PROPERTY INTERFACE_LINK_LIBRARIES boost::system )
set_property( TARGET boost::filesystem PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${boost_INCLUDE_DIR} )
add_dependencies( boost::filesystem external_boost )

最佳答案

ExternalProject_Add创建将驱动拉动外部项目的目标。这意味着下载、构建和安装外部项目发生在 期间。构建步骤 .因此,外部项目的属性在配置步骤中是未知的,因此您不能直接依赖(或 find_package)它。

解决方案是使用所谓的 super 构建。这个想法是使用 find_package在您的项目中获取依赖项,就好像它们已安装在系统上一样。然后创建另一个包含 ExternalProject_Add 的 CMakeLists.txt所有依赖项的说明 和您的项目 .

当您在 super 构建的 CMakeLists.txt 上调用 cmake 时,它​​只会设置一个构建系统来下载和构建所有项目,但什么都不做。当您调用 build 时,项目将被一一下载、配置、构建和安装。因此,当涉及到您的项目时,所有依赖项都已安装,并且配置步骤将成功。

super 构建的例子可以在这里找到(我没有尝试过,但至少你可以理解):https://github.com/Sarcasm/cmake-superbuild .请注意,cmake/SuperBuild.cmake 中的最后一条指令是主 CMakeLists.txt(也就是您的项目)的 ExternalProject_Add。

另请参阅 CMake 文档 https://cmake.org/cmake/help/v3.10/module/ExternalProject.html了解如何在 ExternalProject 级别定义依赖项。

关于cmake - 将 Boost 构建为 ExternalProject_Add 并使用 FindBoost 或导出结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46825046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com