c++ - 如何使用 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
解决方案
推荐阅读
- jquery - 仅当 img src 存在时如何显示 div?
- binary - 更改为没有数组的二进制
- php - 如何修复 PHP 代码中未定义的变量?
- excel - 平面和点之间的二维角度分量
- node.js - 跟踪从 redux action 到 reducer 的时间
- javascript - 为javascript执行INT?
- php - Laravel 模型或 Laravel 的工作方式
- python - XlsxWriter 中的条形着色取决于正/负值
- c - 检查字符串是否为回文(CodeSignal 测试用例问题)
- bash - Jenkins Pipiline:让 awk 命令玩得好