【问题标题】:Linker C++11 error with header-only仅标头的链接器 C++11 错误
【发布时间】:2016-04-20 08:48:28
【问题描述】:

我试图为现有项目编写一个仅包含标头的库。 编译器没有错误(不再),但链接器(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

你知道发生了什么吗?

【问题讨论】:

  • 我从来没有听说过一个叫 rode 的库,但它似乎不仅仅是 header。
  • 只有标头的库按定义在其标头中定义了所有符号。
  • 这是我做过的。所以也许我犯了一个错误,但基本上我只是使用了标题。有点像 Boost 中的许多库
  • 来自 rODE 的每个符号都在标题内

标签: c++ c++11 linker clang


【解决方案1】:

解释可能在错误中:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-06-03
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
相关资源
最近更新 更多