ずぼらは、コマンドプロンプトでDLL?

|

コードの使い回しや部品(サブルーチンや関数)の再利用、ライブラリー化、構造化などは、C++が騒ぎ出す遥か以前からC言語で導入済みでした。

今、C++ってどうなの? 影が薄くなったって言うか風前の灯、一歩手前?
他の簡潔明瞭な言語に取って代わられつつあり、C++其の物が孤立無援というか、ガラパゴス化(複雑怪奇)感満載というか・・・。

それはさて置き。

ずぼらのめんどくさがり屋は、IDEなんて使いこなせる訳が有りません。DOS窓(コマンドプロンプト)にcl入れて、コンパイルするのが関の山。

試しに、C++ ⇒ CのDLL、C ⇒ C++のDLLを呼び出すだけのサンプルを作ってみました。

お試し環境
  WindowsXP 32bit Edition
  Visual C++ 2008


/*---- C++ ⇒ C の dll 作成 ---------- コマンドライン ---------------------*/

D:\vc2008\dllchk>cl /LD testc.c /link /def:testc.def
(ライブラリ testc.lib も dll と一緒に作成されます)

D:\vc2008\dllchk>cl testpp.cpp testc.lib

/*----------------------------------------------------------------------------*/

/*---- C ⇒ C++ の dll 作成 ---------- コマンドライン ----------------------*/

D:\vc2008\dllchk>cl /LD testpp.cpp /link /def:testpp.def
(ライブラリ testpp.lib も dll と一緒に作成されます)

D:\vc2008\dllchk>cl testc.c testpp.lib

/*----------------------------------------------------------------------------*/


/*---- C++ ⇒ C の dll 呼出し -------- お試し結果 --------------------------*/

D:\vc2008\dllchk>testpp
Cのサブルーチン1が呼ばれました
Cのサブルーチン2が呼ばれました
Cのサブルーチン3が呼ばれました

/*----------------------------------------------------------------------------*/

/*---- C ⇒ C++ の dll 呼出し -------- お試し結果 --------------------------*/

D:\vc2008\dllchk>testc
C++のサブルーチン1が呼ばれました
C++のサブルーチン2が呼ばれました
C++のサブルーチン3が呼ばれました

/*----------------------------------------------------------------------------*/


/*==== C++ ⇒ C の dll 呼出し ======== お試しソース ========================*/
/*---- testc.def -------------------------------------------------------------*/

LIBRARY testc
EXPORTS
 subc1
 subc2
 subc3

/*----------------------------------------------------------------------------*/

/*---- testc.c ---------------------------------------------------------------*/

#include <stdio.h>

void subc1(void)
{
    printf("Cのサブルーチン1が呼ばれました\n");
}

void subc2(void)
{
    printf("Cのサブルーチン2が呼ばれました\n");
}

void subc3(void)
{
    printf("Cのサブルーチン3が呼ばれました\n");
}

/*----------------------------------------------------------------------------*/

/*---- testpp.cpp ------------------------------------------------------------*/

#include <cstdio>

extern "C" void subc1(void);
extern "C" void subc2(void);
extern "C" void subc3(void);

void main(void)
{
    subc1();
    subc2();
    subc3();
}

/*----------------------------------------------------------------------------*/
/*============================================================================*/


/*==== C ⇒ C++ の dll 呼出し ======== お試しソース ========================*/
/*---- testpp.def ------------------------------------------------------------*/

LIBRARY testpp
EXPORTS
 subpp1
 subpp2
 subpp3

/*----------------------------------------------------------------------------*/

/*---- testc.c ---------------------------------------------------------------*/

#include <stdio.h>

extern void subpp1(void);
extern void subpp2(void);
extern void subpp3(void);

void main(void)
{
    subpp1();
    subpp2();
    subpp3();
}

/*----------------------------------------------------------------------------*/

/*---- testpp.cpp ------------------------------------------------------------*/

#include <cstdio>

extern "C" void subpp1(void)
{
    printf("C++のサブルーチン1が呼ばれました\n");
}

extern "C" void subpp2(void)
{
    printf("C++のサブルーチン2が呼ばれました\n");
}

extern "C" void subpp3(void)
{
    printf("C++のサブルーチン3が呼ばれました\n");
}

/*----------------------------------------------------------------------------*/
/*============================================================================*/