Мой проект имеет следующую структуру:
-project
|- main.cpp
|- CMakeLists.txt
|- Headers
|- animal.cpp
|- animal.hpp
|- lives.cpp
|- lives.hpp
|- CMakeLists.txt
У нас также есть:
#/project/CMakeLists.txt
cmake_minimum_required(VERSION 3.1)
set(CMAKE_CXX_STANDARD 11)
project(main)
include_directories(Headers/)
link_directories(Headers/)
add_subdirectory(Headers)
add_executable(main main.cpp Headers/animal.cpp Headers/lives.cpp)
target_link_libraries(main animal_lib)
target_link_libraries(main genome_lib)
, а также
#/project/Headers/CMakeLists.txt
add_library(lives_lib STATIC lives.cpp lives.hpp)
add_library(animal_lib STATIC animal.cpp animal.hpp)
target_include_directories(lives_lib PUBLIC ./)
target_include_directories(animal_lib PUBLIC ./)
Обратите внимание, что animal.cpp
включает lives.hpp
. Когда я пытаюсь запустить cmake, я получаю ошибку компоновки (undefined reference
). Если я удаляю animal.cpp
и animal.hpp
(и все функции, которые зависят от него, поэтому используются только вещи из lives.cpp
), все работает нормально. Проблема в том, что я использую функцию из lives.hpp
в animal.cpp
, и если да, то как мне это исправить.
Примечание: Я попробовал пару вещейВ основном это предложения от здесь . Но он все равно не связывается правильно.
Сообщение об ошибке:
$ make
[ 33%] Built target animal_lib
Scanning dependencies of target genome_lib
[ 55%] Built target lives_lib
[ 66%] Linking CXX executable main
/usr/bin/ld: CMakeFiles/main.dir/Headers/animal.cpp.o: in function `Animal::set_something(double)':
animal.cpp:(.text+0x53): undefined reference to `Animal::something_else_'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/main.dir/build.make:118: main] Error 1
make[1]: *** [CMakeFiles/Makefile2:77: CMakeFiles/main.dir/all] Error 2
make: *** [Makefile:84: all] Error 2