宣言はあるのに定義(関数の中身)が無い、定義ファイルを一緒にコンパイルしていない、ライブラリ未リンクで出ます。コンパイルは通り、最後のリンクで発覚します。
出るコード
int add(int a, int b); // 宣言だけ・定義が無い
int main() { return add(2, 3); }
エラーメッセージ
/usr/bin/ld: undefined reference to `add(int, int)'
collect2: error: ld returned 1 exit status
直し方
宣言した関数に定義を用意します。別ファイルの定義なら g++ main.cpp add.cpp と一緒に渡します。ライブラリは -lライブラリ名 でリンクします。