8

Visual Studio 2010にアンマネージC++プロジェクトがあります。これは、ベンダーのboost、glut、および別のライブラリを使用しています。Visual Studio 2010のダイナミックで静的なリンクとデプロ​​イ

もっと "dll-indepenendent"実行可能ファイルを作成できるようにプロジェクトをセットアップしました。すべてのブーストライブラリは静的にリンクされており、実行可能ファイルが存在するディレクトリにdllは必要ありません。

glutと同じことですが、私はglut32.dllの代わりに静的なglut32.libをリンクしましたが、問題はありません。

ランタイムライブラリ用にNON-dllバージョン、つまりマルチスレッドデバッグ(デバッグ構成用)とマルチスレッド化リリース構成を選択しました。

私が前に話していたベンダーは、2つの選択肢Vendor.libとVendor.dllを提供しています。

Vendor.libはリンカ - >追加の依存関係に追加されていますが、実行時には常にVendor.dllを実行可能ファイルの同じディレクトリに配置する必要があります。そうしないと、Vendorが見つからないため.dllライブラリ。

この問題をどのように解決すればよいですか?私はすべてのディレクトリに.dllファイルを入れないようにしたいと思います。

exeの同じディレクトリにdllを置いておきたいのですが、Visual StudioにアンマネージC++コンソールアプリケーションを展開する際のガイドラインは何ですか?

私はこの議論について多くの質問とページがあることを知っていますが、この点について私に明確なものはありません。

いくつかのアイデアですか?

答えて

10

マイクロソフトではこれを処理する方法がちょっと面白いです: .dllを作成すると、 .dllにパブリックシンボルを含む.libも作成されます。 .dllをロードするには、.lllにリンクする必要があります。 ランタイムですが、この.libはまだ静的ライブラリではありません。ベンダ が静的​​リンク用のバージョンを提供している場合は、.dllがないか、または2つの.lib(恐らく異なるディレクトリにあるか、異なる名前である)の が存在します。 マイクロソフトが真剣に開発しているもう1つの例は、より多くの人が より困難です。

+2

これはMS特有のものではありません。 Linuxにもインポートライブラリがあります。 – rubenvb

+8

Unixには、ライブラリ(.aファイル)と共有オブジェクト(.soファイル)の2種類の "ライブラリ"があります。ライブラリを提供しているベンダー(通常の意味で)は通常、両方を提供します。 .aファイルにリンクすると静的にリンクし、.soにリンクすると動的にリンクします。 Microsoftソリューションの問題点は、1)動的リンク用に2つの異なるファイルがあり、2)ファイルの1つに静的ライブラリと同じ名前が付いていることです。 –

+0

あなたの答えをありがとう。おそらく私はこの話題で混乱している唯一の人ではないでしょう。つまり、ダイナミックライブラリが必要なときに作成されたものと静的ライブラリになることができるものの2種類の.libファイルがあります。私は別のVendor.libファイルを見つけられないので、私は最初のケースにいると思います...ありがとう! – linello

7

Vendor.libは静的にコンパイルされたライブラリである必要があります。これをリンクするときにVendor.dllが必要な場合、Vendor.libは実際には静的ライブラリではなくインポートライブラリであるようです。

ベンダーが静的ライブラリであるもう1つのVendor.lib(現在の.libより大きいはずです)を提供しているかどうかを確認し、それにリンクしてみてください。もしそうなら、dllは必要ありません。

+0

残念ながら、私はそのライブラリに他の.libファイルを持っていないので、私は動的リンクのケースにいると思います。 .dllを実行可能ディレクトリにコピーするのではなく、.dllを含める(またはSystem32フォルダにコピーする)以外の方法はありません – linello

+0

ベンダーソースにアクセスできる場合、vendor.libを静的ライブラリとしてコンパイルできます。それ以外の場合は、共有ライブラリを使用する必要がある場合、exeは実行時にexeファイルをフォルダに追加するか、%PATH%に含まれているフォルダに置く必要があります。 System32フォルダ)。 – Fraser