【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が無いのがコンパイラ側ではほぼ同じエラーとして出力されるので、結構分かりづらいです。
最後に最近見ていいなと思ったツイートを紹介します。
プログラミングの最中のコンパイルエラーや実行時エラーは「赤信号だったので一時停止する」くらい普通の営みだが、「ガードレールに擦ったので一時停止する」とか「速度違反で切符を切られる」くらいに深刻にとらえている学習者もいるのかもしれない
— Masaki=就寝=Hara (@qnighy) 2017年11月18日
あまり深刻にならずにどんどんエラーにぶつかっていこうと思います。