The jonki

呼ばれて飛び出てじょじょじょじょーんき

ダイナミックリンクライブラリ(DLL)をVisual Studio 2010で作る・使う

まぁMSのリンク見れば終わりなんですけどね。
チュートリアル : ダイナミック リンク ライブラリ (DLL: Dynamic Link Library) の作成と使用

今更な感じがありますが、エラーとかコピペして検索してこのページに来る人がちょっと参考になるかもしれない日記でも書いておきます。

環境


[構成プロパティ]を開く。(プロジェクト右クリック->[プロパティ])

[VC++ディレクトリ]

  • [インクルードディレクトリ]

作成したdllで用いる関数のヘッダーファイルのあるディレクトリを追加

  • [ライブラリディレクトリ]

作成したdllで用いる関数の.libファイルのあるディレクトリを追加

ここでdllにある関数を呼ぶようなプログラムを実行すると下記のようなエラーがでる。
これは当たり前でヘッダーで関数の名前は分ってるものの、中身の定義が書いてあるlibが見えてない

main.obj : error LNK2019: 未解決の外部シンボル "public: static double __cdecl MathFuncs::MyMathFuncs::Add(double,double)" (?Add@MyMathFuncs@MathFuncs@@SANNN@Z) が関数 _main で参照されました。
…\hoge.exe : fatal error LNK1120: 外部参照 1 が未解決です。

libの指定方法はとりあえず2つ。
1. プロパティで設定する
 [構成プロパティ]->[リンカ]->[入力]の[追加の依存ファイル]にlibの名前を追加する。(例:MyFunc.lib)
パスではなく、ファイル名で大丈夫。というのも上記でライブラリディレクトリの設定は完了しているので絶対パスを指定しなくても、ファイル名だけでlibを見つけられる。

2. プログラム内で呼び出す
 プログラム内に書くことで他のプロジェクトに移行するときも、再設定しなおさなくて良いのでオススメ。

#pragma comment(lib, "MathFuncsDll.lib")

これでdllを使った関数呼び出しができるようになった!

ちなみに下記のように表示されている場合、[リンカ]の[入力]のところで、libファイルではなくMyFunc.dllとdllファイルで指定していないかチェックしよう。

MyDll.dll : fatal error LNK1107: ファイルが無効であるか、または壊れています: 0x308 を読み取れません。