CMake заголовочные файлы и файлы реализации в разных папках

Имеется проект с подобной структурой:

include
  | foo
      | first_foo.h
      | second_foo.h
  | bar
      | first_bar.h
      | second_bar.h
src
  | foo
      | first_foo.cpp
      | second_foo.cpp
  | bar
      | first_bar.cpp
      | second_bar.cpp
      | main.cpp
СMakeList.txt

Сам CMakeList.txt выглядит следующим образом:

cmake_minimum_required(VERSION 3.0.0)
project(FooBar VERSION 0.1.0)

include_directories("./include")
include_directories("./include/foo")
include_directories("./include/bar")

aux_source_directory("./src/foo" FOO)
aux_source_directory("./src/bar" BAR)

add_executable(${PROJECT_NAME} ${FOO} ${BAR})

main.cpp:

#include "first_foo.h"
#include "second_foo.h"
#include "first_bar.h"
#include "second_bar.h"
using namespace tests;

int main()
{
    from_first_foo();
    from_second_foo();
    from_first_bar();
    from_second_bar();
    return 0;
}

Проблема в том, что при таких параметрах компилятор выдаёт ошибку:

undefined reference to 'tests::from_first_foo()'
undefined reference to 'tests::from_second_foo()'
undefined reference to 'tests::from_first_bar()'
undefined reference to 'tests::from_second_bar()'

То есть, я так понимаю, что он не может найти файлы реализации. Как сделать так, чтобы он их увидел? Заранее спасибо за ответ.


Ответы (1 шт):

Автор решения: Fat-Zer

У проблемы одна из двух причин:

  • либо tests::from_first_foo() и т.д. действительно ни где не реализованы. О причинах и о том как устранить см. основной ответ: Ссылка на неразрешенный внешний символ (возможные причины).

  • либо виной всему aux_source_directory(). Его не рекомендуется использовать для поиска исходников как раз потому, что ни система сборки ни cmake не будут видеть вновь добавленные файлы в указанные каталоги, пока cmake'у явно не будет дана команда сгенерировать систему сборки заново.

→ Ссылка