私はC++プログラムを作成していますが、ユーザーには.exeファイルしか提供できません。しかし、私はいくつかのDLLを持っているライブラリ(他の中でカール)を使用しています。これらのDLLを.exeファイルにコンパイルすることは可能ですか?C++ .exeでDLLをコンパイルする方法
私はCode :: Blocksとmingwを使用します。
私はC++プログラムを作成していますが、ユーザーには.exeファイルしか提供できません。しかし、私はいくつかのDLLを持っているライブラリ(他の中でカール)を使用しています。これらのDLLを.exeファイルにコンパイルすることは可能ですか?C++ .exeでDLLをコンパイルする方法
私はCode :: Blocksとmingwを使用します。
これを実現するには、static linkingが必要です。これには、すべてのライブラリ(およびそれらが再帰的に依存するライブラリ)を静的ライブラリとして利用可能にする必要があります。実行可能ファイルのサイズは、静的ライブラリのすべてのコードを保持するため、大きくなることに注意してください。このため、アプリケーション間で共通のコードを共有できるように、共有ライブラリ(DLL)が最初に発明されたのはこのためです。しかし、それはいつも働くとは限りませんso well on windows。
あなたが本当に望むかもしれないと思うのは、あなたの実行ファイルとそのすべての依存ライブラリをインストールするinstallerです。
私は、特にツールのために、ほとんどの場合、ポータブルを好む。インストーラは、[プログラムの追加と削除]の[スタート]メニュー、デスクトップ、およびプログラムのリストを煩雑にします。だからこそ、この種の質問のためにインストーラを提案するたびに私はうんざりします。 YMMV。それでも、最初の段落のためにupvoted。 – syaz
を使用することができます。
一般に、 DLLにはロード時にLoader Lockを取得し、その時点でDllMainを呼び出すなど、特殊な動作がいくつかあります。理論的なリンカーは、各DllMainがアプリケーションmain()から呼び出されるように手配することができますが、ロードされたロックでは発生しません。このローダーロックはOSによって制御されています。また、DLLはDLLMainを介して新しいスレッドを通知されますが、これも偽造するのはほとんど不可能です。
私はdll2libユーティリティに一度出くわしました。面白い作品、高価なものですが。それは、実質的に任意のdllをスタティックライブラリに変換することができます。スタティックライブラリは、後でアプリケーションとリンクして固体のexeを生成することができます。 IIRCでは、このような生成されたライブラリから関数を入力すると、無料のバージョンで特定の通知(MessageBox)が表示されます。
あなたが欲しいものを持っていることが2002年からDDJでの記事があります:
は、基本的にはMSVCの「遅れ負荷」機能とパッケージングを使用してDLLへのリンクを組み合わせて使用しますEXEの組み込みリソースとしてのDLL。 DLLは、エクスポートのうちの1つへの最初の呼び出しが行われるとき、実行時に自動的に抽出されます。
私はこのテクニックを使用していないので、実際にどの程度効果があるのかについてはコメントできませんが、確かに滑らかなアイデアのようです。
これを本当に実行する必要がある場合は、この素晴らしいライブラリを使用して、メモリからDLLを読み込むことができます。私はリソースからDLLを読み込み、それを私のために読み込むのに使ってきました。
ライセンスに関する問題が発生することがあります。例えば。一部のライセンスでは、プログラムの完全なソースコードを提供する場合にのみ静的リンクが許可されます。 –