12

foo.h関数のさまざまな宣言を含むファイルがあります。これらの関数はすべてファイルに実装されていますfoo.dll。ただし、.hファイルを含めていずれかの関数を使用しようとすると、次のエラーが発生します。

bar.obj : error LNK2019: unresolved external symbol SomeFunction

したがって、明らかに関数の実装は見つかりません。

コンパイラがDLL内の定義を見つけて、それらを.hファイルに関連付けるために何をする必要がありますか?

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

4

3 に答える 3

14

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

.libファイルをリンクする必要があることをリンカーに指示したステップがありません。プロジェクトのリンカの入力+追加の依存関係設定に追加する必要があります。または、ソースコードにリンカー命令を記述することで最も簡単に実行できます。

#include "foo.h"
#pragma comment(lib, "foo.lib")

これはMSVCで機能しますが、他の方法では移植性はありませんが、リンクは機能しません。.libファイルをプロジェクトディレクトリにコピーするか、フルパスを指定します。

于 2013-02-26T14:04:23.557 に答える
10

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

于 2015-01-13T01:07:53.400 に答える
3
  1. dllをビルドするときに、関数定義の前に__declspec(dllexport)キーワードを指定する必要があります
  2. .dllファイルをプロセスメモリにインポートまたはロードする必要があります。
  3. そのdllから使用したい関数のアドレスを取得する必要があります。

開始するためのいくつかの便利なリンク:: MSDNドキュメントSOランダム

于 2013-02-26T14:02:06.833 に答える