【问题标题】:When does ExternalProject_Add build?ExternalProject_Add 何时构建?
【发布时间】:2014-07-01 11:14:40
【问题描述】:

我想构建 openssl 并将我的项目链接到它。在我的项目中,我有一个名为 net 的库,它是使用 openssl 的部分。所以在我的 net\CMakeList 中,我添加了

include_directories(
    ../
  + ../../../ext/openssl/inc32/
)
add_library(net STATIC ${sources})
+ ADD_DEPENDENCIES(net openssl)

在用于组织所有外部库的 ext 文件夹中,我在名为 openssl 的文件夹中有一个全新解压缩的 openssl 源代码。然后我编辑了 ext\CmakeList

message(STATUS "Configuring OpenSSL")
set(openssl_dir openssl)
if (CMAKE_CL_64)
include(ExternalProject)

set(OPENSSL_CONFIGURE perl\ Configure\ VC-WIN64A)
set(OPENSSL_MAKE  ms\\do_win64a\ &&\ nmake\ -f\ ms\\ntdll.mak)

ExternalProject_Add(openssl
    PREFIX openssl
    #-- Download Step ----------
    SOURCE_DIR ${CMAKE_SOURCE_DIR}/ext/openssl
    #--Configure step ----------
        CONFIGURE_COMMAND ${OPENSSL_CONFIGURE}
    #--Build Step ----------
    BUILD_COMMAND ${OPENSSL_MAKE}
    BUILD_IN_SOURCE 1
    #--install Step ----------
    INSTALL_COMMAND ""} 
)

endif()

编译时,编译器报错找不到包含文件,openssl源代码根本没有编译,因为没有out32dll和inc32。

我的问题是:ExternalProject_Add 何时真正构建项目?如果我根据openssl制作我的net库,是否意味着我在构建net时需要先检查并构建openssl?

【问题讨论】:

  • 这是因为你需要从vsvarsall.bat的环境开始。
  • 抱歉 ruslo,我不太明白你的回答。你介意给我更多信息吗?谢谢。
  • @RAM:请停止将标签大量编辑成问题。将这种大规模编辑留给不需要审核的用户。即使您编辑标签,也要确保修复帖子的所有问题。
  • @BDL 在这种情况下,谁会在有关使用 cmake 的 ExternalProject_Add 的问题中添加外部项目标签?没人吗?
  • @RAM:当你在正常过程中遇到这样的问题时,编辑它们就可以了,但从编辑中我看到它看起来更像是你在专门搜索可以添加标签的问题.其中一些已经有好几年了。将其留给拥有超过 2k 的用户,或者等到您自己拥有 2k。批量编辑 (

标签: windows cmake openssl 64-bit external-project


【解决方案1】:

ExternalProject 在内部使用add_custom_target 来创建项目并根据其文档

默认情况下,没有任何东西依赖于自定义目标。使用 ADD_DEPENDENCIES 向其他目标添加依赖项或从其他目标添加依赖项。

所以如果没有项目依赖它,默认不会构建。

  1. 这个 ExternalProject_Add 什么时候真正构建项目?

    在构建时(不是在 cmake 时)。

  2. 如果我让我的net库依赖于openssl,是否意味着我在构建net时需要先检查并构建openssl?

    没有。由于您创建了依赖项,cmake 将处理它,并且 openssl 将在您的库之前构建。

PS:还有很多工作要做。因为 cmake 不知道 openssl 结果在哪里,所以你的项目可能会遇到链接错误。这是a good example 来自"What is the best way to build boost with cmake" 的答案。它使用add_libraryIMPORTED GLOBALset_target_propertiesIMPORTED_LOCATION_* 来解决问题

【讨论】:

  • 感谢@user3790229的回复
  • 稍后我会担心链接错误。我认为ADD_DEPENDENCIES 的行使我的网络项目依赖于openssl,所以我期待当我构建我的项目时,cmake 会在我的网络项目之前自动检查并构建openssl。如果我使用这些命令手动构建 OpenSSL,构建之后会生成 2 个(可能更多)文件夹,inc32 和 out32dll。
【解决方案2】:

安装错过

首先,我认为您错过了安装步骤。见documentation

nmake -f "ms\ntdll.mak" 安装

ExternalProject_Add 的简化版是:

ExternalProject_Add(
    OpenSSL
    URL https://github.com/openssl/openssl/archive/OpenSSL_1_0_1h.tar.gz
    CONFIGURE_COMMAND perl Configure VC-WIN64A "--prefix=${CMAKE_INSTALL_PREFIX}"
    BUILD_COMMAND "ms\\do_win64a.bat"
    COMMAND nmake -f "ms\\ntdll.mak"
    BUILD_IN_SOURCE 1
    INSTALL_COMMAND nmake -f "ms\\ntdll.mak" install
)

查找 OpenSSL

其次,如果要查找openssl库和头文件,需要使用find_package(OpenSSL)命令:

find_package(OpenSSL REQUIRED)
message("Libs: ${OPENSSL_LIBRARIES}")
message("Includes: ${OPENSSL_INCLUDE_DIR}")

构建

现在,如果您将所有这些命令放在一个项目中配置步骤将失败:) 因为这不是 ExternalProject 的设计方式。必须先配置由几个或一个 ExternalProject_Add 命令创建的超级构建,然后构建步骤将安装来自外部存档的库。这将与您的项目冲突,因为无法找到 openssl 库 - superbuild 尚未安装它们。

修复

拆分 cmake 代码。先运行superbuild(即下载并安装openssl):

> cmake -Hsuperbuild -B_builds\superbuild "-GVisual Studio 12 2013 Win64" -DCMAKE_INSTALL_PREFIX=ext\install
# note, no ext\install directory yet
> cmake --build _builds\superbuild
# install done, libraries can be found in ext\install

然后构建your project,注意在配置步骤中找到的库:

> cmake -Huse -B_builds\use "-GVisual Studio 12 2013 Win64" -DCMAKE_INSTALL_PREFIX=ext\install
-- Found OpenSSL: .../ext/install/lib/ssleay32.lib;.../ext/install/lib/libeay32.lib (found version "1.0.1h")
Libs: .../ext/install/lib/ssleay32.lib;.../ext/install/lib/libeay32.lib
Includes: .../ext/install/include
> cmake --build _builds\use
# OK

实验性

我有一个实验项目,将所有这些噪音都包含在一个命令中(Windows 在 Visual Studio 2013 上测试):

hunter_add_package(OpenSSL)
find_package(OpenSSL REQUIRED)

【讨论】:

    猜你喜欢
    • 2015-09-22
    • 1970-01-01
    • 2021-02-10
    • 2022-07-06
    • 2018-03-05
    • 1970-01-01
    • 2019-11-01
    • 2013-07-01
    • 2023-03-14
    相关资源
    最近更新 更多