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 шт):
У проблемы одна из двух причин:
либо
tests::from_first_foo()и т.д. действительно ни где не реализованы. О причинах и о том как устранить см. основной ответ: Ссылка на неразрешенный внешний символ (возможные причины).либо виной всему
aux_source_directory(). Его не рекомендуется использовать для поиска исходников как раз потому, что ни система сборки ниcmakeне будут видеть вновь добавленные файлы в указанные каталоги, пока cmake'у явно не будет дана команда сгенерировать систему сборки заново.