Правильный способ структурирования проекта на основе CMake с помощью класса Template - PullRequest
0 голосов
/ 15 марта 2020

У меня возникла следующая проблема компиляции с моим проектом с классом шаблона

Undefined symbols for architecture x86_64:
  "Node<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::Node(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)", referenced from:
      _main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [apps/main] Error 1
make[1]: *** [apps/CMakeFiles/main.dir/all] Error 2
make: *** [all] Error 2

Мои файлы структурированы следующим образом:

├── include
│   └── maple
│       └── node.hpp
├── src
│   ├── CMakeLists.txt
│   └── node.cpp
├── apps
│   ├── CMakeLists.txt
│   └── main.cpp
└── CMakeLists.txt

/ CmakeLists.txt

add_subdirectory(src)
add_subdirectory(apps)

/ src / CMakeLists.txt

set(HEADER_LIST "${maple_SOURCE_DIR}/include/maple/node.hpp")
add_library(node_lib STATIC node.cpp ${HEADER_LIST})
target_include_directories(node_lib PUBLIC ../include)

/ app / CMakeLists.txt

add_executable(main main.cpp)
target_link_libraries(main PRIVATE node_lib)

/ include / maple / node.hpp

template <class T>
class Node
{
private:
    int key;
    T value;
public:
    Node();
    Node(int key, T value);
};

/src/node.cpp

template<class T>
Node<T>::Node() {
}

template<class T>
Node<T>::Node(int key, T value) {
    key = key;
    value = value;
}

template Node<std::string>;

/ app / main. cpp

int main()  {
   Node<std::string> node(3, "abc");
   return 0;
}

Может кто-нибудь подсказать мне, как правильно скомпилировать этот проект?

Я уже знаю, что шаблонный класс нуждается в реализации вместе с определением

Я спрашиваю, как добиться компиляции с использованием Cmake, когда .h и. cpp для шаблонного класса в разных каталогах, как в типичном C ++ проекте.

...