実行可能ファイルを作る、ヘッダファイルをインクルードする、hoge.hファイルの置き場所を確認する

  • 昨日の記事でC++をRから使うための記事を書き始めたけれど、案の定、コンパイルのいろいろに翻弄されて座礁した
  • もう一度、初めから
  • 初めの一歩
    • 1枚ファイルで実行するプログラムをc++で書く。ただし、画面に何が起きているかが出てこないと、そもそも何をしているのかわからないので、整数を指定して、それを画面上に表示するプログラムとする。この「表示」という作業をするために、stdio.hというヘッダーファイルをインクルードして、printf()関数が使えるようにしている
// this is testmain.cpp
#include <stdio.h>
int main(void){
	int n = 3;
	printf("%d\n", n);
	return 0;
}
    • このコンパイルだと、実行可能ファイルができるのだけれど、実行可能ファイル名を指定していないので、デフォルト名a.exeができる(ウィンドウズの場合。その他の場合はa.outができる)。実行するとたしかに3が表示される。
ryamada@D14092901 ~/CppTest
$ g++ testmain.cpp

ryamada@D14092901 ~/CppTest
$ ./a
3
    • 実行可能ファイル名を指定するには以下のようにする。
$ g++ testmain.cpp -o jikoh

ryamada@D14092901 ~/CppTest
$ ls
a.exe  jikoh.exe  testmain.BAK  testmain.cpp

ryamada@D14092901 ~/CppTest
$ ./jikoh
3
    • じゃあ、このstdio.hというファイルがどこにあるか、というと、今やっている環境では、cygwin以下のusr/include/の下にある。このファイルを削除すると(名前を変えて、後で戻すことにする方が実際的)、コンパイルできなくなるかと言えば、以下のように確かにできない。
ryamada@D14092901 ~/CppTest
$ g++ testmain.cpp
testmain.cpp:2:17: fatal error: stdio: No such file or directory
compilation terminated.
  • ヘッダファイル
    • ちなみに、このヘッダファイルというのは、関数の定義が書いてあったり、クラスの定義が書いてあったりするものなのだが、いろいろとそれ以外のこともごちゃごちゃ書いてある。定義している関数が、他で読み込んだヘッダファイルにも同名で書いてあったらどうするか、とか、C++として読み込みつつ、別のところではCも組み合わせて書いたりすると、さらにこんがらがる(このC++とCとの使いまわしを可能にするために関数・クラスの名称がコンパイラによって修正されるのだが、その結果、うまくいかなくなることをマングリングというらしい)ので、そのときにどういう決着をつけるか、とか。
    • また、ヘッダファイルは、「インクルード」されるもので、インクルードするということを、コンパイルしたいC++ファイル内で"#include"と宣言している
    • インクルードパス。インクルードするべきファイル名を宣言したところで、どこにそのファイルがあるのかがわからなければ、見つけられない。したがってインクルードするべきヘッダファイルの置き場へのパスはデフォルトで指定してある。別のところに置くのであれば、g++の実行時のオプションで指定する必要が出る
    • インクルードするときに、ファイル名を"hoge.h"と指定する場合もあればと括弧囲みする場合もあれば、のようにhがない場合もある。"" と<>との違いは、カレントディレクトリを最初に探すか、いきなりインクルード先としてパス指定されているものを探すかの違いか、ということらしい。
    • 自作ヘッダーファイルをカレントディレクトリに置いてインクルードする場合
      • 以下のtestmai2.cppファイルから"jisaku.h"なる名前のヘッダーファイルをインクルードする
// this is testmain2.cpp
#include <stdio.h>
#include "jisaku.h"
int main(void){
	int n = 3;
	int n2 = jisakudouble(n);
	printf("%d\n", n2);
	return 0;
}
//jisaku.h

int jisakudouble(int x){
  return(x*2);
}
      • "jisaku.h"という書き方をすると、まずはカレントディレクトリを探しに行くので
ryamada@D14092901 ~/CppTest
$ g++ testmain2.cpp -o jisaku2

ryamada@D14092901 ~/CppTest
$ ./jisaku2
6
    • これを、ヘッダーファイル置き場を決めて参照させるには "jisaku.h"をに書き換えて、それを、適当なディレクトリに置き、g++の-Iオプションで指定する
// this is testmain3.cpp
#include <stdio.h>
#include <jisaku.h>
int main(void){
	int n = 3;
	int n2 = jisakudouble(n);
	printf("%d\n", n2);
	return 0;
}
$ g++ testmain3.cpp -o jisaku3 -I/cygwin/home/ryamada/include