【C++】リンカー

リンカー

関数や変数は、宣言(declaration)と定義(definition)することが出来る。
宣言(declaration)
型の情報や名前などのシンボルの概要をコンパイラに伝える
以下のような関数を宣言すると、コンパイラにMyPrint(symbol)という関数が存在する(function exists)ということを伝える。

void MyPrint(std::string const& msg);
定義(definition)
シンボルの詳細を示し、その名前が参照しているメモリを確保する。

void MyPrint(std::string const& msg)
{
 std::cout << msg << std::endl;
}
リンカーの挙動1
以下のようなコードの場合、コンパイルもビルドも成功する。
MyPrintの定義が存在しないが、MyPrintを使用している箇所がないためリンカーが探しにいくことはない。

#include <iostream>

void MyPrint(std::string const& msg);

int Addition(int a, int b) {
	// MyPrint("Use Addition");
	return a + b;
};

int main() {
	auto t = Addition(1, 2);
}
リンカーの挙動2
リンカーの挙動1との違いは、AdditionでMyPrintを使用するが、Addition自体は使用しないようにしている。
一見すると、リンカーの挙動1と同様に、コンパイルもビルドも成功するように思えるが、ビルド時にリンキングエラーが発生する。
これは、ファイル内でAdditionが使用されていないということは、他のファイルで使用される可能性があるため、リンカーがMyPrintを探すため。

#include <iostream>

void MyPrint(std::string const& msg);

int Addition(int a, int b) {
	MyPrint("Use Addition");
	return a + b;
};

int main() {
	//auto t = Addition(1, 2);
}