Ошибка связывания CMake с многоуровневым каталогом sr c - PullRequest
0 голосов
/ 27 марта 2020

У меня проблемы со связыванием моего проекта с помощью 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-файл, и все ссылки были сделаны правильно.

...