- 次のような、自作ライブラリを用いたプログラムを作ることにする
- メイン関数は、内部で指定した整数を、二つの関数で変換し、その二つの出力の和を表示する
- メイン関数が呼び出す自作関数は
- (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というディレクトリに置いてある(これが自作ヘッダファイルの置き場である)
- まずはテキストファイルを提示する
#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;
}
#include <jisaku2.h>
int jisakudouble(int x){
return(x*2);
}
int jisakuf1(int x){
int y = jisakudouble(x);
int z = y + 3;
return(z);
}
#include <jisaku2.h>
int jisakuf2(int x){
int y = x + 4;
int z = jisakudouble(y);
return(z);
}
#ifndef R_Y_20150613
#define R_Y_2
int jisakudouble(int x);
int jisakuf1(int x);
int jisakuf2(int x);
#endif
- コンパイルは以下の手順で
- 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