m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

pleiades(eclipse)のCDT(MinGW)でDLLを作成する

会社とかでするときとかさあ

VisualStudioないんですけど…
なんで買っといてくんないの(´・ω・`)
Community入れたくなるんですけど…

というわけで

フリーかどうか知らんがeclipseに入っていたMinGWを使ってDLLを作成してみる

プロジェクトを作成する

共用ライブラリとして作成

f:id:m_shige1979:20170806104546j:plain

ソースディレクトリと空のソースファイルを用意

f:id:m_shige1979:20170806104746j:plain

実装
/*
 * sample01.cpp
 *
 *  Created on: 2017/08/06
 *      Author: hogehoge
 */


extern "C" {
	__declspec(dllexport)

	/**
	 * 加算
	 */
	int add(int a, int b) {
		return a + b;
	}
};

extern "C" {
	__declspec(dllexport)

	/**
	 * 減算
	 */
	int sub(int a, int b) {
		return a - b;
	}
};
プロパティのリンカーフラグを追加

f:id:m_shige1979:20170806105454j:plain
※「-static」を追加

ライブラリ名などを設定

f:id:m_shige1979:20170806105611j:plain
※インポートライブラリ名を「libsample01.lib」を作成する
※defファイルとして「sample01.def」を作成する

ビルドを行う

f:id:m_shige1979:20170806105912j:plain
Debugディレクトリ配下に作成されていることを確認

静的インポートで使用する

プロジェクトを作成する

f:id:m_shige1979:20170806110533j:plain

プロパティのリンカーのその他のオブジェクトに「libsample01.lib」を追加

f:id:m_shige1979:20170806110743j:plain
※リンカーフラグに「-static」も忘れずに追加

実装
//============================================================================
// Name        : sample02.cpp
// Author      :
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
using namespace std;

// エクスポート関数定義
extern "C" __declspec(dllexport) int add(int a, int b);
extern "C" __declspec(dllexport) int sub(int a, int b);

int main() {
	cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!

	cout << add(100, 40) << endl;
	cout << sub(100, 40) << endl;

	return 0;
}

※ヘッダーファイル用意するのめんどかったので今回は直書きです。

ビルド

f:id:m_shige1979:20170806111223j:plain
※「libsample01.dll」を配置しておくこと

実行
!!!Hello World!!!
140
60

できた感じです。

わかったこと

eclipseMinGW(64bit)はリンカーフラグに「-static」を設定しないとcoutが出力してくれない
・dllは実行プログラムと同じ場所もしくはsystem32などのシステムファイルに配置しないと読み込まない
c言語ってjavaとかと違って例外とか発生させないのでエラーでも結果がよくわからんw

所感

そもそもC言語できないんですけどね(´・ω・`)
あんましやる気はないけどとりあえずやってみた感じです。
C++のクラスとかそこそこやってみようかな…