16

元の質問は少し異なりましたが、より重要な質問の一部です。

Qt 5.2 を Windows で静的 OpenSSL を使用して静的にビルドしようとしています。

私の最終的な目標は、libeay32.dll と ssleay32.dll を提供する必要なく、単一のバイナリを出荷することです。しかし、これは不可能だと私には思えます。静的opensslライブラリを使用して静的Qtを構築しましたが、Qtは提供されたライブラリを完全に無視し、常にDLLを検索しているようです。

この回答は、QtNetwork が常に DLL を検索し、他のすべてを無視することも示唆していますが、「OpenSSL を Qt にコンパイルする2 つのオプションがあります...」と述べていますが、そうではないようです。

誰かが決定的な答えを提供できますか?

これは私のQt設定です(読みやすくするために改行が追加されています):

configure -static -qmake -opensource -nomake examples -opengl desktop
-platform win32-msvc2010 -openssl -I C:\git\openssl\build\include
-L C:\git\openssl\build\lib OPENSSL_LIBS="-llibeay32 -lssleay32 -lgdi32"
4

4 に答える 4

12

静的OpenSSLで静的Qtを構築する方法はありますか?

確かに、Qt を構成するときに次のオプションを使用する必要があります。

-openssl-linked

その理由は、QtNetwork がQLibraryライブラリを動的に開いて必要なシンボルを取得するためにデフォルトでクラスを使用するためです。

これは、Qt にそうしないように指示し、通常のリンケージ ルールを尊重するためのオプションです。

そうは言っても、あなたの関与なしにエンドユーザーがセキュリティ更新を利用できるようにする必要がある場合は、openssl に静的リンクを使用することはお勧めしません。あなたがいなくなったらどうなるか、このプロジェクトにもう取り組んでいないなどのことを少し考えてみてください。

また、このセットアップは頻繁にテストされないため、実際にはアップストリームで修正する必要のある問題が発生する可能性がありますが、これは問題のユース ケースのソリューション設計です。

免責事項: SO はプログラミングに関するものであるため、Qt に対する静的リンクのライセンスの結果を無視しています。そのため、法的な問題に巻き込まれないように適切な使用法を認識していることをすぐに思い出させてください。

于 2014-01-11T21:59:10.860 に答える
1

OPENSSL_LIBS="-llibeay32 -lssleay32"...

(および、および) は-l完全に避けてください。リンカーは、静的リンクの要求を無視する場合があり (Apple)、スクリプトがそれを変更する場合もあります (カスタム ビルド スクリプトがどれだけ私を苦しめたかはわかりません)。-L-Wl,-Bstatic

代わりに、オブジェクト ファイルを使用する場合と同様に、完全に指定されたアーカイブを使用してください。以下をLDLIBS追加することで、スクリプトが失敗したり、リンカーがリクエストを無視したりする可能性がなくなります。

/usr/local/ssl/lib/libssl.a /usr/local/ssl/lib/libcrypto.a

明らかに、インストールに合わせてlibssl.aとのパスを変更する必要があります。libcrypto.a

がない場合は、(または IDE の「その他のリンカー フラグ」) にLDLIBS追加します。LDFLAGS

QMAKE_LFLAGSQt では、 orのように見えますLIBS。または、この投稿を試すこともできます: How to add "Additional Dependencies" (Linker settings) .

同じトリックが共有オブジェクトにも適用されます (ただし、リンカーは共有オブジェクトを優先するため、通常は問題になりません)。つまり、次を指定できます。

/usr/local/ssl/lib/libssl.so /usr/local/ssl/lib/libcrypto.so

上記のように共有オブジェクトを指定する際に覚えておくべきことrpathは、実行時リンカーが確実にメッセージを受け取るように を指定する必要があるということです。つまり、LDFLAGS「その他のリンカー オプション」に以下を追加する必要があります。

-Wl,-rpath=/usr/local/ssl/lib

にある OpenSSL FIPS Capable Library を使用するときに共有オブジェクトを指定するときに、いくつか噛まれまし/usr/local/ssl/libた。OpenSSL FIPS Capable Library は、必要なものです。/usr/lib/usr/lib64FIPS_mode_set

静的アーカイブだけを残して、その場所から共有オブジェクトを削除 (または名前変更) することもできます。Xcode for iPhone でビルドするときは、過去にこの手法を使用する必要がありました。適切に配置された .xml があっても、Xcode は静的アーカイブの使用を拒否しました-Bstatic。(クロス コンパイラと変更されたツールチェーンは、使用するのが最悪の場合があります)。インストール ディレクトリを変更する必要はないと思うので、通常はこの手法を使用しません。

要約すると、 、 、 、および を避け-l-Lください-Wl,-Bstatic。必要なものを完全に指定し、完全修飾ライブラリ パス名を使用して、それらをオブジェクト ファイルのように使用します。rpath共有オブジェクトを指定する場合はan を使用します。

于 2014-01-11T08:16:48.157 に答える
0

Win 10 で OpenSSL を使用して Qt を静的にビルドする

  1. Qt メンテナンス ツールから Qt 5.15.1 ソース コードをダウンロードします。
  2. Python、Perl、OpenSSL、jom をインストールする
  3. それらがPath環境変数にあることを確認してください。
  4. VS 2019 の x64 ネイティブ ツール コマンド プロンプトを開く

ここから OpenSSL をダウンロードします https://slproweb.com/products/Win32OpenSSL.html

# remove previous config cache
rm /d/Qt/5.15.1/Src/config.cache

set OPENSSL_DIR=C:\Program Files\OpenSSL-Win64
configure.bat -release -opensource -confirm-license -static -no-pch -optimize-size -opengl desktop -platform win32-msvc  -prefix "D:\Qt\5.15.1\msvc2019_64_static" -skip webengine -nomake tools -nomake tests -nomake examples -openssl-linked OPENSSL_INCDIR="%OPENSSL_DIR%\include" OPENSSL_LIBDIR="%OPENSSL_DIR%\lib\VC\static" OPENSSL_LIBS="-lWs2_32 -lGdi32 -lAdvapi32 -lCrypt32 -lUser32 -llibssl64MDd -llibcrypto64MDd" OPENSSL_LIBS_DEBUG="-llibssl64MDd -llibcrypto64MDd" OPENSSL_LIBS_RELEASE="-llibssl64MD -llibcrypto64MD"  

D:\jom_1_1_3\jom.exe -j8
D:\jom_1_1_3\jom.exe -j8 install
于 2020-09-29T06:36:36.750 に答える