При работе с 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"
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Допустим у меня есть функтор и некий класс определенные в namespace
Смотрю описание шаблонов и заметил, что имена параметров везде помечены как необязательные, но ведь если имя отсутствует, то параметр внутри...