6

我想构建 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制作我的网络库,这是否意味着当我构建网络时需要先检查并构建openssl?

4

2 回答 2

4

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

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

因此,如果没有项目依赖它,则默认不会构建。

  1. 当这个 ExternalProject_Add 实际构建项目时?

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

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

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

PS:还有很多工作要做。因为 cmake 不知道 openssl 结果在哪里,所以你的项目可能会遇到链接错误。这是“What is the best way to build boost with cmake”的回答中的一个很好的例子。它使用with和with来解决问题add_libraryIMPORTED GLOBALset_target_propertiesIMPORTED_LOCATION_*

于 2014-07-02T10:58:33.403 回答
1

安装错过

首先,我认为您错过了安装步骤。请参阅文档

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

然后构建您的项目,注意在配置步骤中找到的库:

> 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

实验性的

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

hunter_add_package(OpenSSL)
find_package(OpenSSL REQUIRED)
于 2014-07-03T17:27:07.577 回答