Ошибка сборки CMake - отсутствует виртуальная таблица для ошибки виртуального метода - PullRequest
0 голосов
/ 30 января 2019

Наш проект Xcode C ++ преобразуется в сценарий CMake.При создании сценария CMake постоянно возникает ошибка vtable, если я использую класс с виртуальными функциями в моей фиктивной main.Если я использую в своем классе только класс без виртуальных функций, все будет нормально.

Проект прекрасно работает для Xcode.Чего мне не хватает в моем скрипте CMake?

Файл CMake:

cmake_minimum_required(VERSION 3.0)
add_compile_options(-std=c++17)
SET (PROJECT_SOURCE_DIR "${CMAKE_SOURCE_DIR}/source")

include_directories(
    "${PROJECT_SOURCE_DIR}/"
    "${PROJECT_SOURCE_DIR}/main/"
    "${PROJECT_SOURCE_DIR}/lib/hopscotch-map/"
    "${PROJECT_SOURCE_DIR}/lib/rapidjson/"
)

add_executable(TestProject "${PROJECT_SOURCE_DIR}/main/dummy-main.cpp")
install(TARGETS TestProject DESTINATION bin) 

Основной файл:

#include <stdio.h>
#include "Player.hpp"

int main(int argc, char **argv) {
    auto player = Player{"John"};
    return 0;
}

Журналы:

jess$ gmake -j 8 VERBOSE=1
/usr/local/Cellar/cmake/3.13.3/bin/cmake -S/Users/jess/TestProject -B/Users/jess/TestProject --check-build-system CMakeFiles/Makefile.cmake 0
/usr/local/Cellar/cmake/3.13.3/bin/cmake -E cmake_progress_start /Users/jess/TestProject/CMakeFiles /Users/jess/TestProject/CMakeFiles/progress.marks
gmake -f CMakeFiles/Makefile2 all
gmake[1]: Entering directory '/Users/jess/TestProject'
gmake -f CMakeFiles/TestProject.dir/build.make CMakeFiles/TestProject.dir/depend
gmake[2]: Entering directory '/Users/jess/TestProject'
cd /Users/jess/TestProject && /usr/local/Cellar/cmake/3.13.3/bin/cmake -E cmake_depends "Unix Makefiles" /Users/jess/TestProject /Users/jess/TestProject /Users/jess/TestProject /Users/jess/TestProject /Users/jess/TestProject/CMakeFiles/TestProject.dir/DependInfo.cmake --color=
Dependee "source/BaseEntity.hpp" is newer than depends file "/Users/jess/TestProject/CMakeFiles/TestProject.dir/depend.internal".
Clearing dependencies in "/Users/jess/TestProject/CMakeFiles/TestProject.dir/depend.make".
Scanning dependencies of target TestProject
gmake[2]: Leaving directory '/Users/jess/TestProject'
gmake -f CMakeFiles/TestProject.dir/build.make CMakeFiles/TestProject.dir/build
gmake[2]: Entering directory '/Users/jess/TestProject'
[ 50%] Building CXX object CMakeFiles/TestProject.dir/source/main/dummy-main.cpp.o
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++   -I/Users/jess/TestProject -I/Users/jess/TestProject/source -I/Users/jess/TestProject/source/lib/hopscotch-map -I/Users/jess/TestProject/source/lib/rapidjson -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk   -std=c++17 -fPIC -fexceptions -g -O3 -o CMakeFiles/TestProject.dir/source/main/dummy-main.cpp.o -c /Users/jess/TestProject/source/main/dummy-main.cpp
[100%] Linking CXX executable TestProject
/usr/local/Cellar/cmake/3.13.3/bin/cmake -E cmake_link_script CMakeFiles/TestProject.dir/link.txt --verbose=1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++   -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/TestProject.dir/source/main/dummy-main.cpp.o  -o TestProject
Undefined symbols for architecture x86_64:
  "Player::Player(std::__1::basic_string_view<char, std::__1::char_traits<char> >)", referenced from:
      _main in dummy-main.cpp.o
  "vtable for BaseEntity", referenced from:
      Player::~Player() in dummy-main.cpp.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for Player", referenced from:
      Player::~Player() in dummy-main.cpp.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)
gmake[2]: *** [CMakeFiles/TestProject.dir/build.make:84: TestProject] Error 1
gmake[2]: Leaving directory '/Users/jess/TestProject'
gmake[1]: *** [CMakeFiles/Makefile2:73: CMakeFiles/TestProject.dir/all] Error 2
gmake[1]: Leaving directory '/Users/jess/TestProject'
gmake: *** [Makefile:130: all] Error 2

1 Ответ

0 голосов
/ 30 января 2019

Подсказка скрыта в выводе компоновщика:

Undefined symbols for architecture x86_64:
  "Player::Player(std::__1::basic_string_view<char, std::__1::char_traits<char> >)", referenced from:
  _main in dummy-main.cpp.o
  "vtable for BaseEntity", referenced from:
  Player::~Player() in dummy-main.cpp.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for Player", referenced from:
  Player::~Player() in dummy-main.cpp.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.

, который сразу предупреждает меня, что вы забыли связать модуль компиляции, содержащий определения этих функций.

Предполагая, что Player определено в player.hpp и player.cpp и что они находятся в подкаталоге src, тогда я предлагаю обновить add_executable вызов:

add_executable(TestProject "${PROJECT_SOURCE_DIR}/main/dummy-main.cpp" src/player.hpp src/player.cpp)

Обратите внимание, что здесь подразумевается «текущий исходный или двоичный каталог», и нет необходимости его прописывать.

Также обратите внимание, что я включил заголовочный файл как часть цели.В этом есть ряд преимуществ:

  • при создании файлов проекта для visual studio, xcode и т. Д., Эти файлы будут отображаться в дереве проекта.
  • При использовании последней версии INSTALL командам, эти файлы могут иметь свойства, обеспечивающие их правильную обработку (например, общедоступные или частные заголовочные файлы для библиотечных целей)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...