2009-05-01 17 views
7

私はC++プログラムを作成していますが、ユーザーには.exeファイルしか提供できません。しかし、私はいくつかのDLLを持っているライブラリ(他の中でカール)を使用しています。これらのDLLを.exeファイルにコンパイルすることは可能ですか?C++ .exeでDLLをコンパイルする方法

私はCode :: Blocksとmingwを使用します。

+1

ライセンスに関する問題が発生することがあります。例えば。一部のライセンスでは、プログラムの完全なソースコードを提供する場合にのみ静的リンクが許可されます。 –

答えて

9

これを実現するには、static linkingが必要です。これには、すべてのライブラリ(およびそれらが再帰的に依存するライブラリ)を静的ライブラリとして利用可能にする必要があります。実行可能ファイルのサイズは、静的ライブラリのすべてのコードを保持するため、大きくなることに注意してください。このため、アプリケーション間で共通のコードを共有できるように、共有ライブラリ(DLL)が最初に発明されたのはこのためです。しかし、それはいつも働くとは限りませんso well on windows

あなたが本当に望むかもしれないと思うのは、あなたの実行ファイルとそのすべての依存ライブラリをインストールするinstallerです。

+1

私は、特にツールのために、ほとんどの場合、ポータブルを好む。インストーラは、[プログラムの追加と削除]の[スタート]メニュー、デスクトップ、およびプログラムのリストを煩雑にします。だからこそ、この種の質問のためにインストーラを提案するたびに私はうんざりします。 YMMV。それでも、最初の段落のためにupvoted。 – syaz

3

あなたはXBundlerのようないくつかの特別なパッカーのツールを必要ILMerge

+0

ILMergeはネイティブコードではなく、マネージコードでのみ動作すると思います。 – Ferruccio

+0

それは本当です。私は彼らが.NETで働いていたDLLをパッケージ化しようとしていたので、私は仮定しました – Ichorus

+0

C++の(Microsoft方言)はILにコンパイルできます。 –

2

を使用することができます。

0

一般に、 DLLにはロード時にLoader Lockを取得し、その時点でDllMainを呼び出すなど、特殊な動作がいくつかあります。理論的なリンカーは、各DllMainがアプリケーションmain()から呼び出されるように手配することができますが、ロードされたロックでは発生しません。このローダーロックはOSによって制御されています。また、DLLはDLLMainを介して新しいスレッドを通知されますが、これも偽造するのはほとんど不可能です。

3

私はdll2libユーティリティに一度出くわしました。面白い作品、高価なものですが。それは、実質的に任意のdllをスタティックライブラリに変換することができます。スタティックライブラリは、後でアプリケーションとリンクして固体のexeを生成することができます。 IIRCでは、このような生成されたライブラリから関数を入力すると、無料のバージョンで特定の通知(MessageBox)が表示されます。

4

あなたが欲しいものを持っていることが2002年からDDJでの記事があります:

は、基本的にはMSVCの「遅れ負荷」機能とパッケージングを使用してDLLへのリンクを組み合わせて使用​​しますEXEの組み込みリソースとしてのDLL。 DLLは、エクスポートのうちの1つへの最初の呼び出しが行われるとき、実行時に自動的に抽出されます。

私はこのテクニックを使用していないので、実際にどの程度効果があるのか​​についてはコメントできませんが、確かに滑らかなアイデアのようです。

2

これを本当に実行する必要がある場合は、この素晴らしいライブラリを使用して、メモリからDLLを読み込むことができます。私はリソースからDLLを読み込み、それを私のために読み込むのに使ってきました。

https://github.com/fancycode/MemoryModule

関連する問題