6

openssl をビルドし、それに対して自分のプロジェクトをリンクしたいと考えています。私のプロジェクトには、openssl を使用する部分である net というライブラリがあります。だから私の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()

私がビルドしたとき、コンパイラはインクルード ファイルが見つからないと文句を言いました。out32dll と inc32 がないため、openssl ソース コードはまったくビルドされませんでした。

私の質問は: 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 の結果がどこにあるかわからないため、プロジェクトでリンク エラーが発生する可能性があります。これは、「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}")

ビルド

ここで、これらすべてのコマンドを 1 つのプロジェクト構成ステップにまとめると、失敗します :) それは、ExternalProject が設計した方法ではないためです。いくつかまたは 1 つの ExternalProject_Add コマンドで作成されたスーパービルドを最初に構成する必要があります。次に、ビルド ステップで外部アーカイブからライブラリをインストールします。openssl ライブラリが見つからないため、これはプロジェクトと競合します。それらはまだスーパービルドによってインストールされていません。

修理

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

実験的

このノイズをすべて 1 つのコマンドでラップする実験的なプロジェクトがあります (Windows は Visual Studio 2013 でテスト済み)。

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