header-only 的链接器 C++11 错误

Linker C++11 error with header-only

我尝试为现有项目编写 header-only 库。 编译器没有错误(不再),但链接器(clang)失败...

我正在使用 CMake,我的库中添加了以下行:

set(RODE_DIR rode)
include_directories (${RODE_DIR})

错误如下:

Undefined symbols for architecture x86_64:
  "sfm::StreamlineWrf::ComputeStreamline(sfm::NdArray<float>*, sfm::NdArray<float>*, sfm::NdArray<float>*, sfm::NdArray<float>*, int&, int&, int&, double const*, int, double, std::__1::vector<double, std::__1::allocator<double> >*)", referenced from:
      _main in wrf2sl.cc.o
  "sfm::ijktos(sfm::NdArray<float>*, sfm::NdArray<float>*, sfm::NdArray<float>*, int const*, double const*, double*, double*, double*)", referenced from:
      _main in wrf2sl.cc.o
  "typeinfo for MethodModel", referenced from:
      typeinfo for HeunEuler1 in wrf2sl.cc.o
      typeinfo for HeunEuler2 in wrf2sl.cc.o
      typeinfo for DormandPrince in wrf2sl.cc.o
      typeinfo for BogackiShampine in wrf2sl.cc.o
      typeinfo for RK41 in wrf2sl.cc.o
  "vtable for MethodModel", referenced from:
      MethodModel::MethodModel() in wrf2sl.cc.o
      MethodModel::~MethodModel() in wrf2sl.cc.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for rODE", referenced from:
      rODE::rODE(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, float) in wrf2sl.cc.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for Method", referenced from:
      Method::Method(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, float) in wrf2sl.cc.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for Solver", referenced from:
      Solver::Solver(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, float) in wrf2sl.cc.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for sfm::StreamlineWrf", referenced from:
      sfm::StreamlineWrf::StreamlineWrf(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, float) in wrf2sl.cc.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
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]: *** [expt/wrf2sl] Error 1
make[1]: *** [expt/CMakeFiles/wrf2sl.dir/all] Error 2
make: *** [all] Error 2

你知道这是怎么回事吗?

解释大概在错误:

"缺少 vtable 通常意味着第一个 non-inline 虚拟成员函数没有定义。 "vtable for rODE",引用自:

检查你的 类 、方法、方法模型、求解器等,并检查它们的每个虚拟成员函数,并确保每个函数都有一个在 .c / .cxx / .c++ 中的定义正在链接的模块。您可能会发现一个没有定义的文件,或者在未被 CMake 链接的文件中定义的文件。