2016-01-14 3 views
-1

Я попытался запрограммировать библиотеку только для заголовка для существующего проекта. компилятор не имеет ошибок (больше), но линкер (лязг) не удалось ...Ошибка Linker C++ 11 с только заголовком

Я использую 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 

Вы знаете, что происходит?

+0

Я никогда не слышал о библиотеке с именем rode, но, похоже, это не только заголовок. –

+0

Библиотека только для заголовка _by definition_ определяет все свои символы в своем заголовке. – MSalters

+0

Это я сделал. Поэтому, возможно, я допустил ошибку, но в основном я просто использовал для этого заголовки. Немного похоже на многие библиотеки из Boost –

ответ

1

Объяснение, вероятно, в случае ошибки: «недостающие виртуальные таблицы обычно означают, что первый не-рядный виртуальная функция-член не имеет определения „

виртуальные таблицы для Рода“, ссылки из:»

Go через ваши классы, Method, MethodModel, Solver и т. д., и проверяйте каждую из своих виртуальных функций-членов и убедитесь, что у каждого есть определение, которое находится в связанном .c/.cxx/.C++ модуле. Вероятно, вы найдете тот, который либо не имеет определения, либо определен в файле, который не связан с CMake.

+0

Да, это было почти там. На самом деле ответ есть: http://stackoverflow.com/questions/11437242/linker-error-on-pure-virtual-function-call-with-gcc, Спасибо за ваш совет –

Смежные вопросы