72
63

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[C++] 基本的なコンパイル方法 [C++初心者]

Last updated at Posted at 2020-02-25

C++ 言語で書かれたソースコードをコンパイルする基本的な方法を書きます.
コンパイラはインストール済みでパスが正しく通っているものとします.

前提

  • コンパイルしたいファイル: test.cpp
  • 使用するコンパイラ: g++
  • 出力したい実行ファイル名: out

test.cpp

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
mylib.cpp
#include "mylib.h"
#include <cstdio>
void printHello() {
  printf("hello\n");
  return;
}
mylib.h
#ifndef __MYlIB_H_
#define __MYlIB_H_

void printHello();

#endif
test2.cpp
#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 コマンドのインストール方法などは割愛します.

Makefile
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

72
63
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
72
63

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?