Как подключать с помощью директивы include?
Ваша проблема в том, что вы не компилируете и не линкуете модуль foo.cpp в свое приложение.
add_executable(main main.cpp foo.cpp);
1. Если не брать внеязыковых средств типа moc процесс выглядит так - препроцессирование, компиляция, линковка. 
2. Да, вам придется компилировать все, что необходимо скомпилировать
3. Включая хедер в код вы именно включаете кусок текста, не более.