プログラマーの卵の日記

備忘録になってます!小難しそうなことから超簡単なことまでやってます!!

【C++】動的ライブラリ(DLL)を作りたい

※補足
Visual Studio 2019でやります。まぁ古くても新しくても基本的なことは何も変わってないから見た目以外気にしなくていいけど。

※参考
http://pickles-ochazuke.hatenablog.com/entry/2017/07/05/171806

構成


No.1 DLL作成用のプロジェクト用意
No.2 DLL用のcppとhppを作成
No.3 実際に使ってみる







    No.1 DLL作成用のプロジェクト用意


 DLLを作成するためにプロジェクトを用意します。
少し手間が増えますが以下のようにプロジェクトを用意します。

f:id:yutateno:20191110165829p:plain


少し気にかけてほしい部分と注意してほしい部分を丸で囲っときます。

f:id:yutateno:20191110165840p:plain



そうしたらこのようなプロジェクトが出来ると思います。

f:id:yutateno:20191110165849p:plain



これでDLL用のプロジェクトは終わりですが、実際にちゃんと動くかテストしたいのでDLLを使うテスト用のプロジェクトも用意します。
テスト用なのでコンソールのプロジェクトを作ります。作成の説明は端折ります。設定の説明はこの後にします。





    No.2 DLL用のcppとhppを作成


 cppとhppを普通のプロジェクトと同じように作成します。
ただし、名前は制限をかける必要があります。名前は必ずプロジェクト名と同じにします。今回の場合はDLLTestです。

f:id:yutateno:20191110165906p:plain



そうしたらDLLTest.hppにこのような記述を書きます。これが必須です。


#ifdef DLLTEST_EXPORTS
#define DLLTEST_API __declspec(dllexport)
#else
#define DLLTEST_API __declspec(dllimport)
#endif



今回はテスト用としてDLLTestという名前でプロジェクトを作成しました。
自分用にプロジェクトを作成した場合上のもののこの部分を変えてください。


#ifdef プロジェクト名_EXPORTS
#define プロジェクト名_API __declspec(dllexport)
#else
#define プロジェクト名_API __declspec(dllimport)
#endif



そしたら今回のDLLは足し算したものを出力するという超単純なライブラリにします。
そのためにhppをこのように書きます。
関数の前にDLLTEST_APIというものを書いていますが、これはDLLを使う側が呼べるものに対して書きます。一応分かりやすいように書いてないものも用意します。


#pragma once


#ifdef DLLTEST_EXPORTS
#define DLLTEST_API __declspec(dllexport)
#else
#define DLLTEST_API __declspec(dllimport)
#endif

namespace DLLTest
{
	DLLTEST_API int Sum(int a, int b);
	int Sub(int a, int b);
}


そしたらcppをこのように書きます。
cppではpch.hを呼ぶのを忘れないようにしてください。


#include "pch.h"
#include "DLLTest.hpp"

namespace DLLTest
{
	int Sum(int a, int b)
	{
		return (a + b);
	}


	int Sub(int a, int b)
	{
		return (a - b);
	}
}






    No.3 実際に使ってみる


 では、実際にDLLを呼んで動かしたいと思います。
呼び方は二通りあるのですが、まずはDLLを作りながらデバッグテストを行うための手段でやります。

先ほど調整していたDLLのプロジェクトを呼びます。

f:id:yutateno:20191110165927p:plain

 

f:id:yutateno:20191110165939p:plain



そうしたらDLLのプロジェクトにあるDLLTest.hppをインクルードファイルに追加します。

f:id:yutateno:20191110165952p:plain



そうしたらDLLTest.hppを使えるように参照に追加します。

f:id:yutateno:20191110170036p:plain

 

f:id:yutateno:20191110170021p:plain



これで使えるようになったので以下のように記述してテストします。


#include 
#include "DLLTest.hpp"

int main()
{
	std::cout << DLLTest::Sum(10, 20) << std::endl;

	return 0;
}


で、おkです。
この方法だとDLLTestにて変更を加えて保存をした後にDLLTestを使うプロジェクトにて実行すればすぐ反映されたものを使えるようになります。ちょっとコードでの反映は遅いですが、デバッグテストしながらやる分には良いと思います。


次に完成したDLLを呼ぶ方法を説明します。先ほどのままだと色々と困るので「No.3 実際に使ってみる」にて設定したものをすべて削除します。よくわからない人は新しくプロジェクトを作ってもいいと思います。

では、DLLTestの中にあるこれらを適当なファイルに移します。分かりやすいようにDLLTestを使う側のプロジェクト内にDLLTestという名前のディレクトリを作成してそこに入れます。

f:id:yutateno:20191110170053p:plain



それとDLLTest.dllはexeと同じ場所にいないといけないのでexeの出力場所に起きます。

f:id:yutateno:20191110170118p:plain



そうしたらDLLTestを使う側のプロジェクトにて設定を行います。
C/C++のインクルードディレクトリに追加します。厳密にはDLLTest.hppを追加します。

f:id:yutateno:20191110170109p:plain



リンカーにライブラリディレクトリを追加します。厳密にはDLLTest.libを追加します。

f:id:yutateno:20191110170145p:plain

 

f:id:yutateno:20191110170155p:plain



これで終わりです。
ただ分かるようにDLLTestの方はDebugでしかやってないのでDebugのみの調整をしました。Releaseを想定するならそちらの方も同様に設定すればいいです。