萌えハッカーニュースリーダー

2025/06/11 03:24 Using `make` to compile C programs

出典: https://jvns.ca/blog/2025/06/10/how-to-compile-a-c-program/
hakase
博士

やあ、ロボ子。今日はC/C++プログラムをソースからコンパイルする方法について話すのじゃ。

roboko
ロボ子

博士、よろしくお願いします。ソースからコンパイル、少し難しそうですが、ぜひ教えてください。

hakase
博士

まずは、Cコンパイラが必要じゃな。Ubuntuなら`build-essential`、MacならXcode Command Line Toolsをインストールするのじゃ。

roboko
ロボ子

なるほど。コンパイラがないと始まらないんですね。それから、プログラムの依存関係もインストールする必要があるんですね。READMEに書いてあることが多いんでしょうか?

hakase
博士

そうじゃ、READMEは宝の山じゃぞ。依存関係が書いてあるから、パッケージマネージャーを使ってインストールするのじゃ。

roboko
ロボ子

`./configure`を実行してMakefileを生成、`make`でビルド、`make install`でインストール、という流れですね。

hakase
博士

`make -j8`を使うと並列ビルドできて速いのじゃ。覚えておくと良いぞ。

roboko
ロボ子

並列ビルド、便利そうですね!コンパイラとリンカについても教えてください。

hakase
博士

コンパイラはソースコードをオブジェクトファイルに変換するのじゃ。`gcc`とか`clang`が有名じゃな。リンカはオブジェクトファイルを最終的なバイナリに結合するのじゃ。`ld`がそれじゃ。

roboko
ロボ子

オブジェクトファイルをまとめるのがリンカの役割なんですね。依存関係で問題が起きた場合はどうすれば良いですか?

hakase
博士

ヘッダーファイルやライブラリファイルの場所をコンパイラとリンカに教えてあげる必要があるのじゃ。環境変数`CPPFLAGS`と`LDLIBS`を使うのじゃ。

roboko
ロボ子

`CPPFLAGS`はコンパイラに、`LDLIBS`はリンカに指示を出すんですね。`CPPFLAGS="-I/opt/homebrew/include" LDLIBS="-L/opt/homebrew/lib -liconv" make paperjam` のように使うんですね。

hakase
博士

その通り!ロボ子は飲み込みが早くて助かるのじゃ!特定のファイルだけビルドしたいときは`make $FILENAME`じゃ。

roboko
ロボ子

なるほど、便利ですね。他のパッケージングシステムのビルドファイルを参照するのも参考になるんですね。

hakase
博士

NixOSの例も参考になるのじゃ。`env.NIX_LDFLAGS = lib.optionalString stdenv.hostPlatform.isDarwin "-liconv";`みたいな感じで書くのじゃ。

roboko
ロボ子

Cプログラムの基本的な知識があると、Cプログラミングを専門としなくても役立つんですね。勉強になりました!

hakase
博士

そうじゃぞ!C/C++は奥が深いからの。最後に一つ、C言語で一番難しいのは何だと思う?

roboko
ロボ子

えーと、ポインタですか?

hakase
博士

残念!正解は… Segmentation faultを直すことじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search