<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>C++ on M1KE BL0G</title><link>https://www.m1ke.org/tags/c++/</link><description>Recent content in C++ on M1KE BL0G</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><copyright>mike</copyright><lastBuildDate>Mon, 30 Oct 2023 02:11:25 +0900</lastBuildDate><atom:link href="https://www.m1ke.org/tags/c++/index.xml" rel="self" type="application/rss+xml"/><item><title>C++ Way</title><link>https://www.m1ke.org/p/c-way/</link><pubDate>Mon, 30 Oct 2023 02:11:25 +0900</pubDate><guid>https://www.m1ke.org/p/c-way/</guid><description>&lt;img src="https://www.m1ke.org/p/c-way/cpp.png" alt="Featured image of post C++ Way" /&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;高速なアプリケーションを動かすにはC/C++が必須になる&lt;/li&gt;
&lt;li&gt;Pythonで書くと遅くなり、重い腰を上げてC++をやることになったの&lt;/li&gt;
&lt;li&gt;そのためにC++やCmakeの基礎的な疑問をAIにぶつけたので、答えをまとめた&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="全体像"&gt;全体像&lt;/h2&gt;
&lt;p&gt;C/C++ では、プログラムはふつう &lt;strong&gt;1回で全部完成する&lt;/strong&gt;のではなく、下の3つの流れで作られる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;前処理&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コンパイル&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;リンク&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="h-と-c-の役割"&gt;&lt;code&gt;.h&lt;/code&gt; と &lt;code&gt;.c&lt;/code&gt; の役割&lt;/h2&gt;
&lt;h3 id="h"&gt;&lt;code&gt;.h&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;宣言を書く場所&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;例:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;上記のように、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;関数名&lt;/li&gt;
&lt;li&gt;引数の型&lt;/li&gt;
&lt;li&gt;戻り値の型&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;を他のファイルに知らせ。&lt;/p&gt;
&lt;h3 id="c"&gt;&lt;code&gt;.c&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;実装を書く場所&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;例:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;上記のように、実際の処理の中身を書く。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="なぜ-h-と-c-を分けるのか"&gt;なぜ &lt;code&gt;.h&lt;/code&gt; と &lt;code&gt;.c&lt;/code&gt; を分けるのか&lt;/h2&gt;
&lt;p&gt;小さいプログラムなら、1ファイルに全部書いても動く。
でも複数ファイルになると、ある &lt;code&gt;.c&lt;/code&gt; から別の &lt;code&gt;.c&lt;/code&gt; の関数を使いたくなる。&lt;/p&gt;
&lt;p&gt;たとえば&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;main.c&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;add.c&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sub.c&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;があるとき、&lt;code&gt;main.c&lt;/code&gt; は &lt;code&gt;add()&lt;/code&gt; や &lt;code&gt;sub()&lt;/code&gt; の存在を知らないと呼べない。&lt;/p&gt;
&lt;p&gt;そのために &lt;code&gt;.h&lt;/code&gt; を使って、&lt;strong&gt;複数の &lt;code&gt;.c&lt;/code&gt; ファイルで共有する宣言をまとめる&lt;/strong&gt;ということ。&lt;/p&gt;
&lt;p&gt;つまり &lt;code&gt;.h&lt;/code&gt; は、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;複数ファイルのための共通の説明書&lt;/strong&gt;ということ。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="include-の意味"&gt;&lt;code&gt;#include&lt;/code&gt; の意味&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;#34;calc.h&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;は、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;その場所に &lt;code&gt;calc.h&lt;/code&gt; の中身を貼り付ける&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;と思えばOK。&lt;/p&gt;
&lt;p&gt;なので &lt;code&gt;main.c&lt;/code&gt; に &lt;code&gt;#include &amp;quot;calc.h&amp;quot;&lt;/code&gt; があると、コンパイラは &lt;code&gt;main.c&lt;/code&gt; だけでなく、そこに貼られた &lt;code&gt;calc.h&lt;/code&gt; の内容も見る。&lt;/p&gt;
&lt;h3 id="--と--"&gt;&lt;code&gt;&amp;lt; &amp;gt;&lt;/code&gt; と &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/code&gt;
標準ライブラリなど、システム側のヘッダを探す&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#include &amp;quot;calc.h&amp;quot;&lt;/code&gt;
自分のプロジェクト内のヘッダを探す&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="include-は前処理"&gt;&lt;code&gt;#include&lt;/code&gt; は前処理&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;#include&lt;/code&gt; はコンパイルそのものではなく、&lt;strong&gt;前処理&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="前処理の例"&gt;前処理の例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#include&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#define&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#ifndef&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="コンパイル"&gt;コンパイル&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;各 &lt;code&gt;.c&lt;/code&gt; をそれぞれ &lt;code&gt;.o&lt;/code&gt; にする&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="リンク"&gt;リンク&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.o&lt;/code&gt; 同士をつないで実行ファイルにする&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="コンパイルとリンクの違い"&gt;コンパイルとリンクの違い&lt;/h2&gt;
&lt;p&gt;たとえば&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;main.c&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;add.c&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sub.c&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;があるとき、&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcc -c main.c &lt;span class="c1"&gt;# main.o&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcc -c add.c &lt;span class="c1"&gt;# add.o&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcc -c sub.c &lt;span class="c1"&gt;# sub.o&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;のように、&lt;strong&gt;各 &lt;code&gt;.c&lt;/code&gt; は別々にコンパイル&lt;/strong&gt;される。&lt;/p&gt;
&lt;p&gt;そのあとで&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcc main.o add.o sub.o -o app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;として、最後に1つの実行ファイルへまとめる。&lt;/p&gt;
&lt;p&gt;つまり、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.c&lt;/code&gt; 同士が自動で1つのソースになるわけではない&lt;/li&gt;
&lt;li&gt;まず別々に &lt;code&gt;.o&lt;/code&gt; を作る&lt;/li&gt;
&lt;li&gt;最後にリンクして1つにする&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="なぜ-mainc-のコンパイル時に-addc-の中身を見ないのか"&gt;なぜ &lt;code&gt;main.c&lt;/code&gt; のコンパイル時に &lt;code&gt;add.c&lt;/code&gt; の中身を見ないのか&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;gcc -c main.c&lt;/code&gt; の入力は基本的に &lt;strong&gt;&lt;code&gt;main.c&lt;/code&gt; と、その中で &lt;code&gt;#include&lt;/code&gt; されたものだけ&lt;/strong&gt; す。&lt;/p&gt;
&lt;p&gt;だからコンパイラは、&lt;code&gt;main.c&lt;/code&gt; をコンパイルするときに &lt;code&gt;add.c&lt;/code&gt; を勝手には見ない。&lt;/p&gt;
&lt;p&gt;その代わり、&lt;code&gt;add()&lt;/code&gt; の宣言が &lt;code&gt;.h&lt;/code&gt; にあれば、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;add&lt;/code&gt; という関数がある&lt;/li&gt;
&lt;li&gt;引数は &lt;code&gt;int, int&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;戻り値は &lt;code&gt;int&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;と分かるので、&lt;code&gt;main.c&lt;/code&gt; はコンパイルできる。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="コンパイル時に実体はなくてもいいのか"&gt;コンパイル時に実体はなくてもいいのか&lt;/h2&gt;
&lt;p&gt;はい、&lt;strong&gt;普通の関数ならコンパイル時には宣言があれば進められる&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;つまり&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;コンパイル時&lt;/strong&gt;: 宣言が必要&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;リンク時&lt;/strong&gt;: 実装が必要&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;たとえば &lt;code&gt;main.c&lt;/code&gt; が &lt;code&gt;add()&lt;/code&gt; を呼んでいても、コンパイル時には&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;が分かっていればよいということ。&lt;/p&gt;
&lt;p&gt;でも最終的にリンクするときに &lt;code&gt;add()&lt;/code&gt; の本体がないと、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;undefined reference&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;のようなエラーになる。&lt;/p&gt;
&lt;p&gt;つまり、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;コンパイラは「呼び方」を確認し、リンカは「本体の所在」を確認する&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="実装ファイルが自分のヘッダを-include-する理由"&gt;実装ファイルが自分のヘッダを include する理由&lt;/h2&gt;
&lt;p&gt;たとえば&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// sub.c
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;#34;calc.h&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;のように、&lt;code&gt;sub.c&lt;/code&gt; でもヘッダを include することがある。&lt;/p&gt;
&lt;p&gt;これは &lt;code&gt;sub.c&lt;/code&gt; が &lt;code&gt;sub()&lt;/code&gt; を使うためではなく、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ヘッダに書いた宣言と、自分の実装が一致しているか確認するため&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;つまり、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;main.c&lt;/code&gt; が include する → 使うため&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sub.c&lt;/code&gt; が include する → 宣言と実装の答え合わせのため&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="include-guard-とは何か"&gt;include guard とは何か&lt;/h2&gt;
&lt;p&gt;ヘッダの先頭によくある&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#ifndef ADD_H
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define ADD_H
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;これは &lt;strong&gt;include guard&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;これは、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;同じヘッダが複数回読み込まれても、1回だけ有効にする&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ための仕組み。&lt;/p&gt;
&lt;p&gt;これは文法上の絶対ルールではなく、昔からの定番の書き方。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="o-a-so-aout"&gt;&lt;code&gt;.o&lt;/code&gt;, &lt;code&gt;.a&lt;/code&gt;, &lt;code&gt;.so&lt;/code&gt;, &lt;code&gt;a.out&lt;/code&gt;&lt;/h2&gt;
&lt;h3 id="o"&gt;&lt;code&gt;.o&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;オブジェクトファイル
各 &lt;code&gt;.c&lt;/code&gt; / &lt;code&gt;.cpp&lt;/code&gt; をコンパイルした結果&lt;/p&gt;
&lt;h3 id="a"&gt;&lt;code&gt;.a&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;静的ライブラリ
複数の &lt;code&gt;.o&lt;/code&gt; をまとめたもの&lt;/p&gt;
&lt;h3 id="so"&gt;&lt;code&gt;.so&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;共有ライブラリ（動的ライブラリ）
これも元は &lt;code&gt;.o&lt;/code&gt; から作るが、実行時に読み込まれる&lt;/p&gt;
&lt;h3 id="aout"&gt;&lt;code&gt;a.out&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;実行ファイルのデフォルト名
&lt;code&gt;gcc main.c&lt;/code&gt; のように &lt;code&gt;-o&lt;/code&gt; を省略したときにできることがある&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="a-と-so-の違い"&gt;&lt;code&gt;.a&lt;/code&gt; と &lt;code&gt;.so&lt;/code&gt; の違い&lt;/h2&gt;
&lt;p&gt;どちらも元は &lt;code&gt;.o&lt;/code&gt; から作れる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.a&lt;/code&gt; = 静的ライブラリ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.so&lt;/code&gt; = 共有ライブラリ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;違いは「元の材料」ではなく、&lt;strong&gt;できあがったものの使われ方&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.a&lt;/code&gt; はリンク時に実行ファイルへ取り込まれる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.so&lt;/code&gt; は実行時に外から読み込まれる&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="ar-rcs-の意味"&gt;&lt;code&gt;ar rcs&lt;/code&gt; の意味&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ar rcs libmylib.a foo.o bar.o
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;は、&lt;code&gt;.o&lt;/code&gt; をまとめて &lt;code&gt;.a&lt;/code&gt; を作るarchiveコマンド。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;r&lt;/code&gt; = 入れる / 置き換える&lt;/li&gt;
&lt;li&gt;&lt;code&gt;c&lt;/code&gt; = 新規作成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;s&lt;/code&gt; = シンボル索引を作る&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;静的ライブラリを作って、リンクしやすい形に整える&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ということ。&lt;/p&gt;
&lt;h2 id="picオプション"&gt;PICオプション&lt;/h2&gt;
&lt;h3 id="pic-とは何か"&gt;PIC とは何か&lt;/h3&gt;
&lt;p&gt;PIC = &lt;strong&gt;Position-Independent Code&lt;/strong&gt;
位置独立コード。&lt;/p&gt;
&lt;p&gt;これは、&lt;strong&gt;どのメモリアドレスに置かれても動きやすいコード&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;共有ライブラリ &lt;code&gt;.so&lt;/code&gt; を作るときによく使う。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;g++ -fPIC -c foo.cpp -o foo.o
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;g++ -shared -o libmylib.so foo.o
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="picで大事なこと"&gt;PICで大事なこと&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-fPIC&lt;/code&gt; は &lt;code&gt;.o&lt;/code&gt; の作り方&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.so&lt;/code&gt; はその &lt;code&gt;.o&lt;/code&gt; から作る共有ライブラリ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;です。&lt;/p&gt;
&lt;p&gt;しかも、&lt;strong&gt;PIC な &lt;code&gt;.o&lt;/code&gt; から &lt;code&gt;.a&lt;/code&gt; を作ることもできます&lt;/strong&gt;。
つまり &lt;code&gt;-fPIC&lt;/code&gt; は &lt;code&gt;.a&lt;/code&gt; を禁止するものではなく、単に中身の &lt;code&gt;.o&lt;/code&gt; の性質。&lt;/p&gt;
&lt;h2 id="フォルダ構成"&gt;フォルダ構成&lt;/h2&gt;
&lt;h3 id="include--src--third_party"&gt;include / src / third_party&lt;/h3&gt;
&lt;p&gt;よくあるフォルダ構成は以下:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;include/&lt;/code&gt; = 公開ヘッダ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src/&lt;/code&gt; = 実装（非公開）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;third_party/&lt;/code&gt; = 外部ライブラリ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sdkのパターン"&gt;SDKのパターン&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;include/&lt;/code&gt; = 利用者に見せる API&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src/&lt;/code&gt; = SDK 作者の実装ソース&lt;/li&gt;
&lt;li&gt;配布物 = include/ + ビルド済みライブラリ&lt;/li&gt;
&lt;li&gt;利用者 = ヘッダを include して、そのライブラリにリンク&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="makefile--cmake"&gt;Makefile / CMake&lt;/h2&gt;
&lt;p&gt;今までの&lt;code&gt;main.c&lt;/code&gt;、&lt;code&gt;add.c&lt;/code&gt;、&lt;code&gt;sub.c&lt;/code&gt;、&lt;code&gt;calc.h&lt;/code&gt;を使う場合は以下のようになる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-makefile" data-lang="makefile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;app&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;.&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;.&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt;.&lt;span class="n"&gt;o&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gcc main.o add.o sub.o -o app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;main.o&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;.&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;.&lt;span class="n"&gt;h&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gcc -c main.c -o main.o
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;add.o&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;.&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;.&lt;span class="n"&gt;h&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gcc -c add.c -o add.o
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;sub.o&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt;.&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;.&lt;span class="n"&gt;h&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gcc -c sub.c -o sub.o
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rm -f *.o app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;もしくはもっときれいにかける。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-makefile" data-lang="makefile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; gcc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; -Wall -Wextra
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;app&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;.&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;.&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt;.&lt;span class="n"&gt;o&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;$(&lt;/span&gt;CC&lt;span class="k"&gt;)&lt;/span&gt; main.o add.o sub.o -o &lt;span class="nv"&gt;$@&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;%.o&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; %.&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;.&lt;span class="n"&gt;h&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;$(&lt;/span&gt;CC&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;CFLAGS&lt;span class="k"&gt;)&lt;/span&gt; -c $&amp;lt; -o &lt;span class="nv"&gt;$@&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rm -f *.o app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;CMakeの場合は以下になる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-makefile" data-lang="makefile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;cmake_minimum_required(VERSION&lt;/span&gt; &lt;span class="err"&gt;3.16)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;project(calc&lt;/span&gt; &lt;span class="err"&gt;C)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;add_executable(app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;main.c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;add.c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;sub.c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;一言でまとめると、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C/C++ では、ヘッダに宣言、ソースに実装を書き、各ソースを別々にコンパイルし、最後にリンクでつなぐ。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;さらにもう少しかみ砕くと、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.h&lt;/code&gt; は「こう使ってね」という説明書&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.c&lt;/code&gt; / &lt;code&gt;.cpp&lt;/code&gt; は実際の中身&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#include&lt;/code&gt; は説明書を貼り付ける前処理&lt;/li&gt;
&lt;li&gt;コンパイルは各ファイルを別々に処理&lt;/li&gt;
&lt;li&gt;リンクはバラバラの結果を最後につなぐ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最後に超短く言うと:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;宣言&lt;/strong&gt;を共有するために &lt;code&gt;.h&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;実装&lt;/strong&gt;を書くために &lt;code&gt;.c&lt;/code&gt; / &lt;code&gt;.cpp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コンパイル&lt;/strong&gt;で &lt;code&gt;.o&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;リンク&lt;/strong&gt;で実行ファイル&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.a&lt;/code&gt; と &lt;code&gt;.so&lt;/code&gt; はどちらも &lt;code&gt;.o&lt;/code&gt; から作れるが、使い方が違う&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考文献"&gt;参考文献&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://man7.org/linux/man-pages/man1/ld.1.html?utm_source=chatgpt.com" target="_blank" rel="noopener"
&gt;ld(1) - Linux manual page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>