簡単なC++ライブラリ作成とその利用

  • 次のような、自作ライブラリを用いたプログラムを作ることにする
  • メイン関数は、内部で指定した整数を、二つの関数で変換し、その二つの出力の和を表示する
  • メイン関数が呼び出す自作関数は
    • (1)引数を2倍して、3を加える:これを一つのcppファイルに書いておく
    • (2)引数に4を加えてから2倍する:これをもう一つのcppファイルに書いておく
  • 自作関数は、「2倍する」という関数を共通して用いるが、これを相互で同じ名前で書いたりするとおかしなことになるので、この2倍する関数は、ヘッダーファイルでプロトタイプ宣言したうえで、自作関数ファイルの1つにだけ書いておく
  • 「書くもの」は、4ファイル
    • (1) メイン関数を持つ "testmain.cpp"ファイル
    • (2) 1つ目の自作関数を書くファイル "jisakuf1.cpp"
    • (3) 2つ目の自作関数を書くファイル "jisakuf2.cpp"
    • (4) ヘッダーファイル "jisaku2.h"
  • これらのファイルは、testmain.cpp,jisakuf1.cpp,jisakuf2.cppはカレントディレクトリに、jisaku2.hはカレントディレクトリから1つ上に上がったところに置かれたincludeというディレクトリに置いてある(これが自作ヘッダファイルの置き場である)
  • まずはテキストファイルを提示する
    • メイン関数ファイル
// this is testmain.cpp
#include <stdio.h>
#include <jisaku2.h>
int main(void){
	int n = 3;
	int n2 = jisakuf1(n);
	int n3 = jisakuf2(n);
	int n4 = n2 + n3;
	printf("%d\n", n4);
	return 0;
}
    • 1つ目の自作関数ファイル
//jisakuf1.cpp
#include <jisaku2.h>

int jisakudouble(int x){
	return(x*2);
}

int jisakuf1(int x){
	int y = jisakudouble(x);
	int z = y + 3;
	return(z);
}
    • 2つ目の自作関数ファイル
//jisakuf1.cpp
#include <jisaku2.h>

int jisakuf2(int x){
	int y = x + 4;
	int z = jisakudouble(y);
	return(z);
}
    • ヘッダファイル
//jisaku2.h
#ifndef R_Y_20150613
#define R_Y_20150613

int jisakudouble(int x);
int jisakuf1(int x);
int jisakuf2(int x);

#endif //R_Y_20150613
  • コンパイルは以下の手順で
    • 1つ目の自作ファイルをxxx.oファイル(オブジェクトファイル)とし、次いで2つ目の自作ファイルをxxx.oファイルとする。機械語に変換している
    • -Iオプションにより自作ヘッダー jisaku2.hが読まれるように指定している。g++の-cオプションがオブジェクトファイルを作るように指定している
$ g++ jisakuf1.cpp -c -I../include
$ g++ jisakuf2.cpp -c -I../include
    • 次に2つのオブジェクトファイルをアーカイブして、libjisaku2.aというライブラリを作ることにする。この書き方によって"jisaku2"というライブラリができる。"lib"と".a"は指定された使い方。
    • アーカイブコマンドはar、そのオプションとしてrを使うことになっている(らしい)
$ ar r libjisaku2.a jisakuf1.o jisakuf2.o
  • さて、ライブラリができたので、testmain.cppに使わせて、実行可能ファイルを作ろう
    • ライブラリlibjisaku2.aはカレントディレクトリにできているので、それを教えつつ。
      • ライブラリへのパスを -Lオプションで "./"カレントディレクトリであると指定しつつ、使うべきライブラリを -l オプションで"jisaku2"であると指定している。
      • また、testmain.cppでは、ヘッダファイルを参照しているから、それが読み込まれるように、自作ヘッダファイル置き場を-Iオプションで指定している
g++ testmain.cpp -L ./ -l jisaku2
  • 実行する
$ ./a
23