[Tiny-C , TCC]C言語でDLLを作ろう!C言語でDLLをリンクしよう!

妹「お兄ちゃん、DLLってどうやって作るの?」
兄「Visual Studioでも作れるけど、Tiny-Cでも作れるよ。今日はDLLを作ってみよう」

//youwaka.net
#include "stdio.h"
#include "math.h"
//youwaka.net
int DLLSample(int a,int b)
{
	return pow(a,b);
}


兄「できた!累乗を返すDLLだ」
妹「お兄ちゃんは本当にダメだね、main関数が無いとダメだよ」

普通にビルドするとエラーが出る。

兄「DLLだからmain はいらないんだよ」
妹「でもビルドエラーが出てるよね」
兄「-shared オプションをつけるんだ。」

妹「dll1.dllができてるね!」
兄「でもこれだけだと使いづらいんだよね」
妹「どうして……?」
兄「関数がエクスポートされてないからリンクができないんだ。」
妹「実体?リンク?」

兄「じゃあ、このDLLを呼び出すプログラムを作ってみるね」

妹「何のプログラム?」
兄「1の2乗をしてprintfするプログラムだよ」
妹「いつ使うの……?」
兄「サンプルだからいいんだよ……」

tcc dllcall.c dll1.dll errorで失敗しているのはexportされてないから失敗している。
tcc -shared dll1.c __declspec(dllexport)を加えて再度dllを作成
tcc dllcall.c dll1.dll 問題なく成功
dllcall.exe プログラムの呼び出し

兄「上のtcc dllcall.c dll1.dllだと、DLLSampleの実態が見つかってないだろう?エラーが起きているのは関数がexportされてないからだよ」
妹「ふむ?」
兄「__declspec(dllexport)をつけてソースコードを保存し、-sharedでもう一度dllを作ると、問題なくリンクされるよ。ほら、1の2乗を計算してくれるプログラムの完成だ!」
妹「作ったのは微妙なプログラムだけど、DLLについて何となく解ったよ」


兄「よしよし。参考までにきちんとexportできてたら、tiny-cだとdefファイルが自動的に作られるよ」
妹「defファイル?」
兄「defファイル。またそっちは別の説明でするよ」