おはやし日記

テーマ……バイク←プログラミング←旅

makefileを利用して簡単にmac,VSCodeでbits/stdc++.hを使う

こんにちは。

競プロではC++が強いそうですね。

C++ではインクルードファイルとして

#include <iostream> //入出力
#include <string> //文字列
#include <vector> //配列
...

等々書くそうですが、面倒なのでAtCoderでは<bits/stdc++.h>を使うと良い、という話になっています。

これは、gccに付属する、諸々のインクルードファイルを一気に読み込むためのファイルだそうです。つまり

#include <bits/stdc++.h>

とかけば済むということです。

しかし、macでは使えないそうです(参考文献参照)。

これを、makefileを活用して楽に使えるようにしてみました。

ファイル構造

abc150/a.cppコンパイルしてみたいと思います。

@AtCoder
|
|-- abc150
|   |-- a.cpp
|
|-- bits
|   |-- stdc++.h
|
|-- makefile

abc150-a

ちなみに上のa.cppはA - 500 Yen CoinsにACで通過します(それはそう)。

コンパイルしてみる

(環境について何をかけば良いのかあんまりわかってないので不十分かも。ごめんなさい)

普通にコンパイルすると

$ cd .../@AtCoder
$ c++ abc150/a.cpp

abc150/a.cpp:1:10: fatal error: 'bits/stdc++.h' file not found
#include <bits/stdc++.h>
         ^~~~~~~~~~~~~~~
1 error generated.

怒られた。元々のインクルードパスにbits/stdc++.hが無いですよ、ということ。

bits/stdc++.hの準備

ここ↓にあります

libstdc++: stdc++.h Source File

これをコピペして@AtCoder/bits/stdc++.hに保存します。(行番号もコピーしてしまうので頑張って消した)

参考文献にあるように、コンパイル時にインクルードパスを指定してコンパイルすれば良いので

$ c++ -I /Users/.../@AtCoder abc150/a.cpp

これで一応はコンパイルできます。

簡単にする

毎回インクルードパスを書くのは面倒なのでmakefileを作ってそこに書いておきましょう。

ということで、冒頭にも置きましたが

# .../@AtCoder/makefile
%: %.cpp
    c++ -I /Users/.../@AtCoder $< -o $@

これだけ。ちなみに2行目の頭の空白は、スペースではなく「タブ」でなくてはいけません。

それでもって

$ make abc150/a

コンパイル(拡張子.cppをつけないことに注意)。実行は

$ abc150/a

です。

おまけ-Cのファイルとの共存

もともとabc150/a.cがあった場合、今まではmake abc150/aコンパイルできたのが、makefileの変更によってmake abc150/aではc++のファイルがコンパイルされてしまいます。

makefileを改良して

%pp: %pp.cpp
    c++ -I /Users/.../@AtCoder $< -o $@

とし、c++のファイルはapp.cpp, bpp.cppのようにファイル名の方にもppをつけてやるとa.c, b.cとの共存が図れます。

まあ、cをコンパイルするときは先に移動しておけば良いんですけどね

$ cd abc150
$ make a (a.cコンパイル)
$ ./a (実行)

参考文献

Qiitaにも書いてみました

makefileを利用して簡単にmac,VSCodeでbits/stdc++.hを使う - Qiita

プライバシーポリシー ・お問い合わせはこちら