Qt 5 cmake завершается с ошибкой из-за неопределенной ссылки на vtable в hello world с inc и src в качестве подкаталоговC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Qt 5 cmake завершается с ошибкой из-за неопределенной ссылки на vtable в hello world с inc и src в качестве подкаталогов

Сообщение Anonymous »

Обновление 2

После небольшого возни (и некоторого редактирования сгенерированных файлов Makefile), похоже, что происходит то, что moc неправильно обрабатывает MainWindow. h (входит в состав main.cpp и MainWindow.cpp, если только он не находится в той же папке, что и исходные файлы, в которые он был включен.

Moc работает на MainWindow.cpp, не обрабатывает включение и, следовательно, не видит макрос Q_OBJECT, поэтому продолжает создавать пустой выходной файл. Я не уверен, обрабатывает ли moc обычно включение или нет. он просто сканирует каталог, но в любом случае заголовки, которые требуют проверки, но находятся в других каталогах, не обрабатываются!

Обновить

Похоже, проблема связана с выводом, выдаваемым moc. В первом случае (тот, который компилируется), генерируются hello-world_automoc.cpp и moc_MainWindow.cpp hello. -world_automoc.cpp выглядит так:

Код: Выделить всё

/* This file is autogenerated, do not edit*/
#include "moc_MainWindow.cpp"
Во втором случае создается файл hello-world_automoc.cpp, который выглядит так:

Код: Выделить всё

/* This file is autogenerated, do not edit*/
enum some_compilers { need_more_than_nothing };
а moc_MainWindow.cpp вообще нет. Если я вручную вызываю moc из cmake вместо использования automoc в сломанном случае, я получаю moc_MainWindow.cpp, но он пуст.

Исходный статус< /h2>

Во-первых, нет, я не забыл установить (CMAKE_AUTOMOC ON). Также обратите внимание, что деструктор MainWindow объявлен и реализован.

Когда моя структура каталогов выглядит так:


CMakeLists.txt
|__ main.cpp
|__ MainWindow.cpp
|__ MainWindow.h
|__ MainWindow.ui


компиляция работает нормально.

Однако, когда это выглядит так:

helloworld/
|__ CMakeLists.txt
|__ src/
| |__ CMakeLists.txt
| |__ main.cpp
| |__ MainWindow.cpp
|
|__ inc/
| |__ MainWindow.h
|
|__ gui/
|__ MainWindow.ui


Я получаю ошибки при связывании :

Код: Выделить всё

Linking CXX executable hello-world
CMakeFiles/hello-world.dir/MainWindow.cpp.o: In function `MainWindow::MainWindow()':
MainWindow.cpp:(.text+0x3b): undefined reference to `vtable for MainWindow'
MainWindow.cpp:(.text+0x4d): undefined reference to `vtable for MainWindow'
CMakeFiles/hello-world.dir/MainWindow.cpp.o: In function `MainWindow::~MainWindow()':
MainWindow.cpp:(.text+0xaf): undefined reference to `vtable for MainWindow'
MainWindow.cpp:(.text+0xc1): undefined reference to `vtable for MainWindow'
collect2: error: ld returned 1 exit status
make[2]: *** [src/hello-world] Error 1
make[1]: *** [src/CMakeFiles/hello-world.dir/all] Error 2
Мне бы очень хотелось, чтобы исходники и заголовки находились в соответствующих подкаталогах, но я не совсем уверен, как это исправить.

На самом деле это самый простой идентифицируемый случай ошибки в гораздо более крупном проекте, поэтому мне действительно не очень хочется сглаживать каталоги проекта только потому, что я добавляю к нему графический интерфейс Qt.< /п>

Подробнее здесь: https://stackoverflow.com/questions/197 ... ith-inc-sr
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»