他人が作った関数を使うとは?

本題に入る前にファイル分割について説明する。
ソースコートが大きくなるとファイルを分割することがある。
分割は通常関数単位とか、機能ごとに分類したファイルに複数の関数の定義を書くようにする。
a.cとb.cのファイルを例にファイル分割でのコンパイル方法を説明する。(分割するほどのコードではないが)
a.c-----------------------------------------------------------
#include<stdio.h>

int main(int arvc,char argv[]){
        int i;

        i=abc(1);
        printf("%d\n",i);
        return 0;
}

b.c-----------------------------------------------------------------
C:\usr>type b.c
int abc(int x){
        return x+1;
}

コンパイルは、ファイルを並べてコンパイルする。cl a.cとcl b.cを別々にコンパイルするとエラーになる。cl a.cとするとabc関数がないというエラー。cl b.cとするとmain関数がないというエラー。
C:\usr>cl a.c b.c
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

a.c
b.c
コードを生成中...
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:a.exe
a.obj
b.obj
a.objとb.objファイルを作ってからa.exeファイルができている。実行してみる。
C:\usr>a.exe
2
2を出力している。

さて、

ここでabc関数がとても企業秘密になるような難しいことができる関数だとする。b.cファイルでお客様に提供すると内容がバレてしまう。
こんな時はb.objファイルを売ればいい。
参考に以下のようにするとobjファイルを作ることができる。cオプションを使う。(その他のオプションは、cl /?で見ることができる)
C:\usr>cl -c b.c
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

b.c

C:\usr>dir b.obj
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は F81B-E315 です

 C:\usr のディレクトリ

22/02/08  15:20               460 b.obj
               1 個のファイル                 460 バイト
               0 個のディレクトリ  101,039,296,512 バイトの空き領域
お客様は、abc関数を使うa.cファイルを自分で作り、コンパイル時にb.objファイルを使う。
C:\usr>cl a.c b.obj
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

a.c
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:a.exe
a.obj

a.objがa.exeファイル内に取り込まれているのでa.exeファイルのサイズは取り込んだ関数分サイズが大きくなっている。
「今日の訪問数: -
「昨日の訪問数: -
「今までの訪問数: -
名前:
コメント:
最終更新:2010年02月08日 16:40
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。