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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

残念!正解は… Segmentation faultを直すことじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。