Qt и staticMetaObject

125
12 ноября 2019, 19:40

При работе с qt с компилятором mingw столкнулся с такой проблемой: не мог создать коннекты с сигналами которые были определены в моей кастомной динамической библиотеке. После долгих танцев с бубном выяснил в чем проблема: я использовал cmake который автомат экспортирует и импортирует все из библиотек, НО! только не статические методы (и объекты)... В результате при обращению к staticMetaObject получал nullptr и сообщение о том, что такого сигнала нет. Но почему компилятор не сообщил о том, что у него undefined reference (как например это сделал msvc, проверено)?

PS более того, если использовать старый синтаксис для коннектов - то все работает...

PSS прошу прощения что сразу этого не сделал, подумал, что проблема мной описанно предельно ясно (ох уж это проклятие знания)

# cmake
cmake_minimum_required(VERSION 3.12)
project(temp)
find_package(Qt5 COMPONENTS Core)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
set(CMAKE_AUTOMOC ON)
set(LIB_SRC
  Alfa.cpp
  )
add_library(mylib SHARED ${LIB_SRC})
target_link_libraries(mylib PUBLIC Qt5::Core)
set(PROJCT_SRC
  Beta.cpp
  main.cpp
  )
add_executable(${PROJECT_NAME} ${PROJCT_SRC})
target_link_libraries(${PROJECT_NAME} PRIVATE mylib)

// Alfa.hpp
#pragma once
#include <QObject>
class Alfa : public QObject {
  Q_OBJECT
public:
  ~Alfa() = default;
signals:
  void mySignal(int);
public slots:
  void mySlot(int);
};

// Alfa.cpp
#include "Alfa.hpp"
#include <iostream>
void Alfa::mySlot(int a) {
  std::cerr << a << std::endl;
}

// Beta.hpp
#pragma once
#include  "Alfa.hpp"
class Beta : public Alfa {
  public:
    void connecter();
};

// Beta.cpp
#include "Beta.hpp"
void Beta::connecter() {
  connect(this, &Beta::mySignal, this, &Beta::mySlot);
}

// main.cpp
#include "Beta.hpp"
#include <QCoreApplication>
int main(int argc, char *argv[]) {
  QCoreApplication app(argc, argv);
  Beta b;
  b.connecter();
  emit b.mySignal(42);
  return EXIT_SUCCESS;
}

На линуксе все работает (выводит ответ на извечный вопрос жизни, смерти и всего такого). Если компилить mingw, то при запуске выдаст:

QObject::connect: signal not found in Alfa

msvc вообще не скомпилит из-за ошибки:

unresolved external symbol "public:
  static struct QMetaObject const Alfa::staticMetaObject"
READ ALSO
namespace и агрументы функции

namespace и агрументы функции

Допустим у меня есть функтор и некий класс определенные в namespace

94
Большое O для вставки в коллекцию

Большое O для вставки в коллекцию

Как посчитать большое О для вставки в коллекцию?

74
Почему имена в шаблонах необязательны?

Почему имена в шаблонах необязательны?

Смотрю описание шаблонов и заметил, что имена параметров везде помечены как необязательные, но ведь если имя отсутствует, то параметр внутри...

82