C++ 言語で書かれたソースコードをコンパイルする基本的な方法を書きます.
コンパイラはインストール済みでパスが正しく通っているものとします.
前提
- コンパイルしたいファイル:
test.cpp
- 使用するコンパイラ:
g++
- 出力したい実行ファイル名:
out
test.cpp
#include <cstdio>
int main() {
printf("hello\n");
}
コンパイル方法
$ g++ -o out test.cpp
-o out
は省略可能で,デフォルトでは a.out
というファイルが出力されます.
コンパイル結果
コンパイルに成功すると,out
という名前の実行ファイルが生成されます.
$ ls
out test.cpp
実行結果
$ ./out
hello
その他よく遭遇するケース
複数のファイルをコンパイルしたい
-
main
関数が書かれたソース:test2.cpp
- 自作関数が書かれたソース:
mylib.cpp
-
mylib.cpp
に対応するヘッダファイル:mylib.h
#include "mylib.h"
#include <cstdio>
void printHello() {
printf("hello\n");
return;
}
#ifndef __MYlIB_H_
#define __MYlIB_H_
void printHello();
#endif
#include "mylib.h"
int main() {
printHello();
}
コンパイル方法(分割)
-c
オプションをつけることでコンパイルのみ (i.e., 実行ファイルを生成しない) を実行し,オブジェクトファイル test2.o
および mylib.o
生成します.
$ g++ -c -o test2.o test2.cpp
$ g++ -c -o mylib.o mylib.cpp
$ ls
mylib.cpp mylib.h mylib.o test2.cpp test2.o
あとはオブジェクトファイルをまとめて g++
をかけます.
$ g++ test2.o mylib.o -o out
$ ls
mylib.cpp mylib.h mylib.o out test2.cpp
$ ./out
hello
コンパイル方法(一括)
上記のような「分解コンパイル」をせずに,次にように一括でコンパイルすることも可能です.
$ g++ test2.cpp mylib.cpp -o out2
$ ./out2
hello
一括コンパイルと比べると分割コンパイルの手順はやや面倒に見えますが,いくつかの利点があるそうです (参考[2]).
いちいちコンパイルのコマンド覚えて打ち込むの面倒くさい
Makefile を使います.
make
コマンドのインストール方法などは割愛します.
all: test
clean:
rm -f *.o out2
test: test2.cpp mylib.cpp mylib.h
g++ -c -o test2.o test2.cpp
g++ -c -o mylib.o mylib.cpp
g++ -o out2 test2.o mylib.o
これを置けば,make
を打つだけでコンパイルできます.
Makefile の書き方などはここでは説明しません.
$ ls
Makefile mylib.cpp mylib.h test2.cpp
$ make
g++ -c -o test2.o test2.cpp
g++ -c -o mylib.o mylib.cpp
g++ -o out2 test2.o mylib.o
$ ls
Makefile mylib.cpp mylib.h mylib.o out2 test2.cpp test2.o
$ ./out2
hello
その他
個人的によく使うオプション
-
-Wall
: 警告(Warning)をすべて(all)表示します. -
-std=c++11
: C++11 の機能を使いたいときに付けます. -
-I <dir>
: include search path を追加するときに付けます. -
-L <dir>
: library search path を追加するときに付けます. -
-l <file>
: library file をリンクするときに付けます.
参考
[1] http://www.ysr.net.it-chiba.ac.jp/data/cc.html
[2] http://sa.eei.eng.osaka-u.ac.jp/eeisa003/tani_prog/HOWTOprogC/split.htm
[3] https://qiita.com/lrf141/items/9ba070a2a1c3e5faf71c