2013-02-26 15 views
7

私は、ファイルには、さまざまな関数の宣言を持つfoo.hがあります。これらの機能はすべてファイルfoo.dllに実装されています。私は.hファイルを含めると機能のいずれかを使用しようとすると、しかし、私はエラーを取得する:DLLをプロジェクトにリンクするにはどうすればよいですか?エラーLNK2019:未解決の外部シンボル

bar.obj : error LNK2019: unresolved external symbol SomeFunction 

ので、明らかに機能の実装は発見されていません。

コンパイラがDLLの定義を見つけて、それらを.hファイルに関連付けるのに役立つものは何ですか?

私は__declspec(dllexport)__declspec(dllimport)についていくつかのことを見ましたが、それでも使い方は分かりません。

+0

実行ファイルを 'foo.dll'(通常は' foo.lib'という名前)のインポートライブラリにリンクしていますか? –

+0

私はこれを初めて知ったので、どうしたのか分かりません。それはプロジェクトのビジュアルスタジオのプロパティにありますか? – xcdemon05

+1

@ xcdemon05、はい、リンカーオプションの中にあります。 –

答えて

8

あなたはDLLの所有者から少なくともファイルを受け取っているはずです。実行時に必要となるDLL、エクスポートされた関数の宣言を含む.hファイルには、すでにそれがあります。 .libファイルは、DLLのインポートライブラリです。プログラムのインポートテーブルに関数を追加する方法を知るために、リンカが必要とするもの。

リンカーに.libファイルをリンクする必要があると指示した段階がありません。リンカーのプロジェクトのInput + Additional Dependencies設定に追加する必要があります。あるいは、最も簡単にソースコードにリンカ命令を書き込むことによって行わ:

MSVCのために働く
#include "foo.h" 
#pragma comment(lib, "foo.lib") 

、そうでないポータブルが、リンクされていないことはありません。 .libファイルをプロジェクトディレクトリにコピーするか、フルパスを指定します。

+0

'#pragma comment'を使用してlibファイルを' Project Properties> Linker> Input'に追加するのに違いはありますか? – Nitay

+1

違いはありませんが、その設定を変更することを忘れないでください。 –

3
  1. あなたは、プロセスのメモリに.dllファイルをインポートまたはロードする必要があるDLL
  2. を構築する時に関数定義__declspec(のdllexport)キーワードの前に指定する必要があります。
  3. そのDLLから使用したい機能のアドレスを取得する必要があります。

始めるためにいくつかの便利なリンク:: MSDN DocumentationSORandom

6

私はちょうど同様の問題がありました。解決策は、DLLが64ビットであることが判明し、それを使用する単純なアプリケーションは32でした。構成マネージャーでx64に変更するのを忘れてしまいました。

+2

インターネットを3時間検索した後、私の日を保存しました。 – Dan

関連する問題