質問
C ++プログラムを作成していますが、ユーザーに.exeファイルのみを提供できるようにしたいと考えています。ただし、いくつかのdllを含むライブラリ(特にカール)を使用しています。これらのdllを.exeファイルにコンパイルすることは可能ですか?
Code :: Blocksとmingwを使用しています。
解決
これを達成するには、静的リンクが必要です。これには、すべてのライブラリ(およびそれらが再帰的に依存するライブラリ)が静的ライブラリとして利用可能である必要があります。実行可能ファイルは静的ライブラリのすべてのコードを保持するため、実行可能ファイルのサイズが大きくなることに注意してください。これが、アプリケーション間で共通のコードを共有できるように、そもそも共有ライブラリ(DLL)が発明された理由です。ただし、これは常に Windowsでうまく動作するわけではありません。
本当に必要なのは、実行可能ファイルをインストールするインストーラーだと思いますライブラリ。
他のヒント
DDJには2002年の記事があります。
基本的には、MSVCの「遅延ロード」機能を使用してDLLにリンクし、DLLをEXEの埋め込みリソースとしてパッケージ化する組み合わせを使用します。 DLLは、エクスポートの1つが最初に呼び出されたときに、実行時に自動的に抽出されます。
このテクニックを使用したことがないので、どの程度うまく機能するかについては本当にコメントできませんが、確かに洗練されたアイデアのようです。
dll2lib ユーティリティに1回遭遇しました。高価なものですが、興味深い作品。これにより、実質的にすべてのdllを静的ライブラリに変換できます。静的ライブラリは、後でアプリケーションとリンクして、ソリッドexeを生成できます。 IIRC、無料版では、このような生成されたライブラリから関数を入力すると、特定の通知(MessageBox)が表示されます。
XBundler などの特別なパッカーツールが必要です。
これを本当に行う必要がある場合は、この素晴らしいライブラリを使用して、メモリからDLLをロードできます。リソースからDLLを読み取り、ロードしてくれました。
通常、いいえ。 DLLには、ロード時にローダーロックを取得したり、それらのポイントでDllMainを呼び出したりするなど、重要な特別な動作があります。理論的なリンカーは、各DllMainがアプリケーションmain()から呼び出されるように調整できますが、Loaded Lockでは発生しません。このローダーロックは、OSの制御下にあります。また、DLLにはDLLMainを介して新しいスレッドが通知されますが、これも偽造することはほぼ不可能です。