У меня проблемы со связыванием моего проекта с помощью cmake. Проект состоит из библиотеки mylib и исполняемого файла mybin, с которым он связан. Структура выглядит следующим образом:
.
├── CMakeLists.txt
├── include
│ ├── mylib.h
│ ├── entities
│ │ ├── entities.h
│ │ ├── entityA.h
│ │ └── entityB.h
│ └── shapes
│ ├── shapes.h
│ ├── shapeA.h
│ └── entityB.h
└── src
├── main.cpp
├── entities
│ ├── entityA.cpp
│ └── entityB.cpp
└── shapes
├── shapeA.cpp
└── entityB.cpp
Где mylib использует все файлы. cpp и .h (кроме main. cpp) для создания библиотеки stati c, а mybin использует main. cpp и ссылки на mylib.h. mylib.h извлекает другие заголовочные файлы из каталога include.
Прямо сейчас мой CMakeLists.txt выглядит следующим образом:
cmake_minimum_required(VERSION 3.13)
project(myproject VERSION 1.1.0 LANGUAGES C CXX)
add_library(mylib
src/entities/entityA.cpp
src/entities/entityB.cpp
src/shapes/shapeA.cpp
src/shapes/shapeB.cpp
include/mylib.h
include/entities/entities.h
include/entities/entitiesA.h
include/entities/entitiesB.h
include/shapes/shapes.h
include/shapes/shapeA.h
include/shapes/shapeB.h
)
target_include_directories(mylib PUBLIC include)
target_link_libraries(mylib PUBLIC)
target_compile_features(mylib PRIVATE cxx_std_11)
add_executable(mybin src/main.cpp)
target_link_libraries(mybin PRIVATE mylib)
target_compile_features(mybin PRIVATE cxx_std_11)
Когда я пытаюсь построить свой код, с
mkdir build
cd build
cmake ..
make
Библиотека работает нормально, но я получаю ошибки компоновки при сборке исполняемого файла:
/usr/bin/ld: shapeA.cpp:(.text+0x344): undefined reference to `MyLib::Entities::EntityA::normalize_inplace()'
Не уверен, как это исправить, я пытался следовать учебным пособиям по цифрам и смотреть на другие проблемы здесь и примеры, но не мог исправить это. Фактический код находится в my github , в ветке "cmake".
Большое спасибо.
EDIT
Ошибка связи, которую я скопировал Выше используется в файле src / shape / shapeA. cpp:
#include "shapes/shapeA.h"
#include <algorithm>
using MyLib::Entities::EntityA;
Mylib::Shapes::ShapeA::ShapeA() {}
Mylib::Shapes::ShapeA::~ShapeA(){}
bool Mylib::Shapes::ShapeA::intersect(const EntityA &entity) const {
const EntityA invdir = (EntityA(1.0, 1.0, 1.0) + entity).normalize_inplace();
return true;
}
Он определен в src / entity / entityA. cpp:
#include "entities/EntityA.h"
using MyLib::Entities::EntityA;
EntityA::EntityA(double a, double b, double c) :
a_(a), b_(b), c_(c) {}
EntityA::~EntityA(){}
EntityA EntityA::normalize_inplace(){
const double tot = std::sqrt(a_*a_ + b_*b_ + c_*c_);
a_ /= tot;
b_ /= tot;
c_ /= tot;
return EntityA(1.0, 1.0, 1.0);
}
EntityA EntityA::operator+(EntityA other) {
return EntiryA(a_ + other.a_, b_ + other.b_, c_ + other.c_);
}
Есть еще много ошибок связывания, как эта, я думаю, что ничто не связывается правильно вообще. Кроме того, я ранее использовал make-файл, и все ссылки были сделаны правильно.