链接器 C++11 仅标头错误

Linker C++11 error with header-only

本文关键字:错误 C++11 链接      更新时间:2023-10-16

我试图为现有项目编写一个仅标题库。编译器(不再)有错误,但链接器(叮当)失败了...

我正在使用 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 通常意味着第一个非内联虚拟成员函数没有定义。 "vtable for rODE",引用自:"

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