Jer*_*rry 5 windows 64-bit openssl cmake external-project
我想建立openssl并将我的项目链接到它.在我的项目中,我有一个名为net的库,它是使用openssl的部分.所以在我的net\CMakeList中,我补充道
include_directories(
../
+ ../../../ext/openssl/inc32/
)
add_library(net STATIC ${sources})
+ ADD_DEPENDENCIES(net openssl)
Run Code Online (Sandbox Code Playgroud)
在我用于组织所有外部库的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()
Run Code Online (Sandbox Code Playgroud)
当我构建时,编译器抱怨它无法找到包含文件,并且根本没有构建openssl源代码,因为没有out32dll和inc32.
我的问题是:ExternalProject_Add何时实际构建项目?如果我根据openssl创建我的网库,这是否意味着当我构建网络时,它需要先检查并构建openssl?
小智 5
ExternalProject内部使用add_custom_target创建项目并根据其文档
默认情况下,没有任何内容取决于自定义目标。使用 ADD_DEPENDENCIES 向其他目标添加依赖项或从其他目标添加依赖项。
因此,如果没有项目依赖它,则默认情况下不会构建它。
当这个ExternalProject_Add真正构建项目时?
在构建时(而不是在 cmake 时)。
如果我让我的网络库依赖于 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_*
小智 2
首先,我认为您错过了安装步骤。请参阅文档:
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
)
Run Code Online (Sandbox Code Playgroud)
其次,如果你想查找 openssl 库和头文件,你需要使用find_package(OpenSSL)命令:
find_package(OpenSSL REQUIRED)
message("Libs: ${OPENSSL_LIBRARIES}")
message("Includes: ${OPENSSL_INCLUDE_DIR}")
Run Code Online (Sandbox Code Playgroud)
现在,如果您将所有这些命令放在一个项目中,配置步骤将失败:)因为这不是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
Run Code Online (Sandbox Code Playgroud)
然后构建您的项目,注意在配置步骤中找到的库:
> 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
Run Code Online (Sandbox Code Playgroud)
我有一个实验项目,将所有这些噪音包装在一个命令中(Windows 在 Visual Studio 2013 上进行了测试):
hunter_add_package(OpenSSL)
find_package(OpenSSL REQUIRED)
Run Code Online (Sandbox Code Playgroud)