極楽とんぼのロボット製作記

情報工学系大学院生がロボットとその周辺技術や身の回りの出来事について紹介するブログ

【C++】(.text+0x20): `main' に対する定義されていない参照です

「くそ、こんなことで! 」と数十分を無駄にした自分に対する怒りの発散と戒めを込めてエラーと対処方法を書きました。C++を学び始めた方の手助けになればと思います。
環境は
OS: Ubuntu 16.04
コンパイラ: gcc (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609

エラー全文

/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: 関数 `_start' 内:
(.text+0x20): `main' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
CMakeFiles/f-manager.dir/build.make:94: ターゲット 'f-manager' のレシピで失敗しました
make[2]: *** [f-manager] エラー 1
CMakeFiles/Makefile2:67: ターゲット 'CMakeFiles/f-manager.dir/all' のレシピで失敗しました
make[1]: *** [CMakeFiles/f-manager.dir/all] エラー 2
Makefile:83: ターゲット 'all' のレシピで失敗しました
make: *** [all] エラー 2

エラーを見るといかにも仰々しいことが書かれていますが、単にmain関数が無いか、nain等のtypoをしている例です。

エラー全文

/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: 関数 `_start' 内:
(.text+0x20): `main' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
segment_point_cloud/CMakeFiles/segment_point_cloud_node.dir/build.make:391: ターゲット '/home/username/omni_ros/devel/lib/segment_point_cloud/segment_point_cloud_node' のレシピで失敗しました
make[2]: *** [/home/username/omni_ros/devel/lib/segment_point_cloud/segment_point_cloud_node] エラー 1
CMakeFiles/Makefile2:2206: ターゲット 'segment_point_cloud/CMakeFiles/segment_point_cloud_node.dir/all' のレシピで失敗しました
make[1]: *** [segment_point_cloud/CMakeFiles/segment_point_cloud_node.dir/all] エラー 2
Makefile:138: ターゲット 'all' のレシピで失敗しました
make: *** [all] エラー 2
Invoking "make -j4 -l4" failed

ROSで同じようなことをやらかした時の例です。こちらはCMakeList.txtにtarget_link_librariesを指定し忘れた時にでました。
こんな感じでmain関数が無いのとtarget_link_librariesが無いのがコンパイラ側ではほぼ同じエラーとして出力されるので、結構分かりづらいです。
最後に最近見ていいなと思ったツイートを紹介します。


あまり深刻にならずにどんどんエラーにぶつかっていこうと思います。