首页 > 解决方案 > 如何使用 CMake 处理 unique_ptr、one-definition-rule 和模板

问题描述

我已经能够查明问题所在。 在此处输入图像描述

文件的内容A,B,Main(如图所示)如下:

cmake_minimum_required(VERSION 3.13)

add_library(class_a ${CMAKE_SOURCE_DIR}/modules/class_a/class_a.cpp)
target_include_directories(class_a PUBLIC ${CMAKE_SOURCE_DIR}/modules/class_b)
target_link_libraries(class_a PUBLIC class_b)

cmake_minimum_required(VERSION 3.13)
add_library(class_b ${CMAKE_SOURCE_DIR}/modules/class_b/class_b.cpp)

cmake_minimum_required(VERSION 3.13)

add_executable(test_class_a test_class_a.cpp)
target_include_directories(test_class_a PUBLIC ${CMAKE_SOURCE_DIR}/modules/class_a/)
target_link_libraries(test_class_a PUBLIC class_a)

这些类有自己的*.hpp*.cpp文件(前两个是 *.cpp带有定义的 -files,最后一个是test_class_a.cpp

#include "class_a.hpp"
#include "class_b.hpp"

template<typename t>
class_a<t>::class_a() : field(42) {}
template<typename t>
class_a<t>::~class_a() { field^= field; }

template<typename t>
void class_a<t>::do_it() {
    class_b<t> b;
    b.do_something();
}

#include "class_b.hpp"
template<typename t>
class_b<t>::class_b() { info= {}; };
template<typename t>
void class_b<t>::do_something() { return ; }

#include <memory>
#include "class_a.hpp"

int main() {
    auto ptr= std::make_unique<class_a<int>>();
    ptr->do_it();
    return 0;
}

我在其他地方读到,这始终是模板和 的问题,unique_ptr解决方案之一是将所有内容放入一个文件中,而不分离标题和定义。我想知道这是否是唯一的方法,或者是否有某种CMake方法可以保持相同的结构和模块化,并且仍然能够编译?上面的代码给出了编译错误:

[ 33%] Built target class_b
Scanning dependencies of target class_a
[ 50%] Building CXX object modules/class_a/CMakeFiles/class_a.dir/class_a.cpp.o
[ 66%] Linking CXX static library libclass_a.a
[ 66%] Built target class_a
Scanning dependencies of target test_class_a
[ 83%] Building CXX object modules/tests/CMakeFiles/test_class_a.dir/test_class_a.cpp.o
[100%] Linking CXX executable test_class_a
/usr/bin/ld: CMakeFiles/test_class_a.dir/test_class_a.cpp.o: in function `main':
/home/ilo/CLionProjects/mwe/modules/tests/test_class_a.cpp:6: undefined reference to `class_a<int>::do_it()'
/usr/bin/ld: CMakeFiles/test_class_a.dir/test_class_a.cpp.o: in function `std::_MakeUniq<class_a<int> >::__single_object std::make_unique<class_a<int>>()':
/usr/include/c++/8/bits/unique_ptr.h:831: undefined reference to `class_a<int>::class_a()'
collect2: error: ld returned 1 exit status
make[3]: *** [modules/tests/CMakeFiles/test_class_a.dir/build.make:86: modules/tests/test_class_a] Error 1
make[2]: *** [CMakeFiles/Makefile2:129: modules/tests/CMakeFiles/test_class_a.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:141: modules/tests/CMakeFiles/test_class_a.dir/rule] Error 2
make: *** [Makefile:131: test_class_a] Error 2

标签: c++cmake

解决方案


推荐阅读