Qt6 porting, undefined symbol: _ZN10EngineBase16staticMetaObjectEHi
-
Hi,
I'm trying to port an app from Qt5 to Qt6. The app is a media/music player with back-ends (mpv, vlc etc) built as libraries. The app and libraries build fine, the app starts and works but fails to load the back-end libraries.[ 98%] Linking CXX executable yarock [ 98%] Built target yarock [ 98%] Built target enginempv_autogen_timestamp_deps [ 98%] Automatic MOC and UIC for target enginempv [ 98%] Built target enginempv_autogen [ 99%] Building CXX object src/core/player/mpv/CMakeFiles/enginempv.dir/engine_mpv.cpp.o [ 99%] Building CXX object src/core/player/mpv/CMakeFiles/enginempv.dir/enginempv_autogen/mocs_compilation.cpp.o [100%] Linking CXX shared library ../../../../lib/libenginempv.so [100%] Built target enginempv
[Engine] Look into library dir: "/home/Apps/YaRock/Yarock_1.4.0_Sources_qt6/build/lib" [Engine] Audio engine library directory: "/home/Apps/YaRock/Yarock_1.4.0_Sources_qt6/build/lib" [Engine] Try to load "libenginempv.so" "Cannot load library /home/Apps/YaRock/Yarock_1.4.0_Sources_qt6/build/lib/libenginempv.so: /home/Apps/YaRock/Yarock_1.4.0_Sources_qt6/build/lib/libenginempv.so: undefined symbol: _ZN10EngineBase16staticMetaObjectE"
Gentoo Linux, gcc-13, Qt versions 6.6.3 and 6.7.0.
I think it has something to do with the c++-17 standard, if I set it in CMakeLists.txt for the Qt5 code, I get the same error.
The back-ends code:
https://bazaar.launchpad.net/~sebastien-amardeilh/yarock/1.x/files/head:/src/core/playerThanks!
-
Hi,
I'm trying to port an app from Qt5 to Qt6. The app is a media/music player with back-ends (mpv, vlc etc) built as libraries. The app and libraries build fine, the app starts and works but fails to load the back-end libraries.[ 98%] Linking CXX executable yarock [ 98%] Built target yarock [ 98%] Built target enginempv_autogen_timestamp_deps [ 98%] Automatic MOC and UIC for target enginempv [ 98%] Built target enginempv_autogen [ 99%] Building CXX object src/core/player/mpv/CMakeFiles/enginempv.dir/engine_mpv.cpp.o [ 99%] Building CXX object src/core/player/mpv/CMakeFiles/enginempv.dir/enginempv_autogen/mocs_compilation.cpp.o [100%] Linking CXX shared library ../../../../lib/libenginempv.so [100%] Built target enginempv
[Engine] Look into library dir: "/home/Apps/YaRock/Yarock_1.4.0_Sources_qt6/build/lib" [Engine] Audio engine library directory: "/home/Apps/YaRock/Yarock_1.4.0_Sources_qt6/build/lib" [Engine] Try to load "libenginempv.so" "Cannot load library /home/Apps/YaRock/Yarock_1.4.0_Sources_qt6/build/lib/libenginempv.so: /home/Apps/YaRock/Yarock_1.4.0_Sources_qt6/build/lib/libenginempv.so: undefined symbol: _ZN10EngineBase16staticMetaObjectE"
Gentoo Linux, gcc-13, Qt versions 6.6.3 and 6.7.0.
I think it has something to do with the c++-17 standard, if I set it in CMakeLists.txt for the Qt5 code, I get the same error.
The back-ends code:
https://bazaar.launchpad.net/~sebastien-amardeilh/yarock/1.x/files/head:/src/core/playerThanks!
-
@sebaro check if your Engine class has
Q_OBJECT
macro in header. Looks like it might be missing.The symbol is from engine_base which has the macro:
#ifndef _ENGINE_BASE_H_ #define _ENGINE_BASE_H_ #include <QtCore/QObject> #include <QtCore/QString> #include "mediaitem.h" namespace ENGINE { enum E_ENGINE_STATE {PLAYING, PAUSED, STOPPED, ERROR}; } namespace ENGINE { enum E_ENGINE_TYPE { NO_ENGINE = 0, PHONON, VLC, MPV, QTMULTIMEDIA }; } class EngineBase : public QObject { Q_OBJECT Q_DISABLE_COPY( EngineBase ) public: EngineBase(); EngineBase(const QString& name); QString name() {return m_name;} QString version() {return m_version;} ENGINE::E_ENGINE_TYPE type() {return m_type;} bool isEngineOK() {return m_isEngineOK;} /* play/pause/stop */ virtual void play() {}; virtual void pause() {}; virtual void stop(); /* media management*/ virtual void setMediaItem(MEDIA::TrackPtr ) {}; virtual void setNextMediaItem(MEDIA::TrackPtr ) {}; MEDIA::TrackPtr playingTrack() const {return m_currentMediaItem;} MEDIA::TrackPtr nextTrack() const {return m_nextMediaItem;} /* audio*/ virtual int maxVolume() const {return 100;}; virtual int volume() const {return 0;}; virtual void setVolume(const int &) {}; virtual bool isMuted() const {return false;}; virtual void setMuted( bool ) {}; /* state & behavior */ ENGINE::E_ENGINE_STATE state() const {return m_current_state;}; static QString stateToString(ENGINE::E_ENGINE_STATE state); /* time */ qint64 currentTime() const {return m_lastTick;} qint64 currentTotalTime() const {return m_totalTime;} virtual void seek( qint64 ) {}; /* effect */ virtual bool isEqualizerAvailable() { return false;}; virtual void addEqualizer() {}; virtual void removeEqualizer() {}; virtual void applyEqualizer(QList<int>) {}; public slots: virtual void volumeMute( ) {}; virtual void volumeInc( ) {}; virtual void volumeDec( ) {}; public: bool m_isEngineOK; ENGINE::E_ENGINE_STATE m_current_state; ENGINE::E_ENGINE_STATE m_old_state; /* playing media properties */ qint64 m_totalTime; bool m_aboutToFinishEmitted; qint32 m_tickInterval; qint64 m_lastTick; MEDIA::TrackPtr m_currentMediaItem; MEDIA::TrackPtr m_nextMediaItem; signals: void mediaChanged(); void mediaMetaDataChanged(); void mediaAboutToFinish(); void mediaFinished(); void mediaTick(qint64 time); void mediaTotalTimeChanged(qint64 newTotalTime); void mediaSeekableChanged(bool); void engineQueueFinished(); void engineStateChanged(); void engineRequestStop(); void volumeChanged(); void muteStateChanged(); protected : QString m_name; QString m_version; ENGINE::E_ENGINE_TYPE m_type; }; Q_DECLARE_INTERFACE(EngineBase, "yarock.EngineBase/1.0") #endif // _ENGINE_BASE_H_
Adding it in engine doesn't help:
#ifndef _ENGINE_H_ #define _ENGINE_H_ #include <QtCore/QObject> #include <QtCore/QString> #include "engine_base.h" class Engine : public QObject { Q_OBJECT static EngineBase *CORE_INSTANCE; public: Engine(); static EngineBase* instance() { return CORE_INSTANCE; } QString error() { return m_error;} static ENGINE::E_ENGINE_TYPE activeEngine(); private: QString m_error; }; #endif // _ENGINE_H_
Thanks!
-
The symbol is from engine_base which has the macro:
#ifndef _ENGINE_BASE_H_ #define _ENGINE_BASE_H_ #include <QtCore/QObject> #include <QtCore/QString> #include "mediaitem.h" namespace ENGINE { enum E_ENGINE_STATE {PLAYING, PAUSED, STOPPED, ERROR}; } namespace ENGINE { enum E_ENGINE_TYPE { NO_ENGINE = 0, PHONON, VLC, MPV, QTMULTIMEDIA }; } class EngineBase : public QObject { Q_OBJECT Q_DISABLE_COPY( EngineBase ) public: EngineBase(); EngineBase(const QString& name); QString name() {return m_name;} QString version() {return m_version;} ENGINE::E_ENGINE_TYPE type() {return m_type;} bool isEngineOK() {return m_isEngineOK;} /* play/pause/stop */ virtual void play() {}; virtual void pause() {}; virtual void stop(); /* media management*/ virtual void setMediaItem(MEDIA::TrackPtr ) {}; virtual void setNextMediaItem(MEDIA::TrackPtr ) {}; MEDIA::TrackPtr playingTrack() const {return m_currentMediaItem;} MEDIA::TrackPtr nextTrack() const {return m_nextMediaItem;} /* audio*/ virtual int maxVolume() const {return 100;}; virtual int volume() const {return 0;}; virtual void setVolume(const int &) {}; virtual bool isMuted() const {return false;}; virtual void setMuted( bool ) {}; /* state & behavior */ ENGINE::E_ENGINE_STATE state() const {return m_current_state;}; static QString stateToString(ENGINE::E_ENGINE_STATE state); /* time */ qint64 currentTime() const {return m_lastTick;} qint64 currentTotalTime() const {return m_totalTime;} virtual void seek( qint64 ) {}; /* effect */ virtual bool isEqualizerAvailable() { return false;}; virtual void addEqualizer() {}; virtual void removeEqualizer() {}; virtual void applyEqualizer(QList<int>) {}; public slots: virtual void volumeMute( ) {}; virtual void volumeInc( ) {}; virtual void volumeDec( ) {}; public: bool m_isEngineOK; ENGINE::E_ENGINE_STATE m_current_state; ENGINE::E_ENGINE_STATE m_old_state; /* playing media properties */ qint64 m_totalTime; bool m_aboutToFinishEmitted; qint32 m_tickInterval; qint64 m_lastTick; MEDIA::TrackPtr m_currentMediaItem; MEDIA::TrackPtr m_nextMediaItem; signals: void mediaChanged(); void mediaMetaDataChanged(); void mediaAboutToFinish(); void mediaFinished(); void mediaTick(qint64 time); void mediaTotalTimeChanged(qint64 newTotalTime); void mediaSeekableChanged(bool); void engineQueueFinished(); void engineStateChanged(); void engineRequestStop(); void volumeChanged(); void muteStateChanged(); protected : QString m_name; QString m_version; ENGINE::E_ENGINE_TYPE m_type; }; Q_DECLARE_INTERFACE(EngineBase, "yarock.EngineBase/1.0") #endif // _ENGINE_BASE_H_
Adding it in engine doesn't help:
#ifndef _ENGINE_H_ #define _ENGINE_H_ #include <QtCore/QObject> #include <QtCore/QString> #include "engine_base.h" class Engine : public QObject { Q_OBJECT static EngineBase *CORE_INSTANCE; public: Engine(); static EngineBase* instance() { return CORE_INSTANCE; } QString error() { return m_error;} static ENGINE::E_ENGINE_TYPE activeEngine(); private: QString m_error; }; #endif // _ENGINE_H_
Thanks!
-
@sebaro
Just make sure you have done an absolutely full, clean rebuild. Best is to actually delete the build output (not the source!) directory completely and then do a complete rebuild. Spend a couple of minutes verifying that before continuing.I use a build directory, and I clean it after each code change:
cd build cmake .. make
I replaced/removed deprecated and obsolete class members and changed the main and plugin cmake files:
CMakeLists.txt
# ------------------------------------------------------------------------------ # YAROCK CMAKE FILE # ------------------------------------------------------------------------------ cmake_minimum_required(VERSION 3.16) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ) PROJECT( yarock ) set(YAROCK_MAJOR_VERSION 1) set(YAROCK_MINOR_VERSION 5) set(YAROCK_PATCH_VERSION 0) set(YAROCK_VERSION "${YAROCK_MAJOR_VERSION}.${YAROCK_MINOR_VERSION}.${YAROCK_PATCH_VERSION}") # ------------------------------------------------------------------------------ # build def # ------------------------------------------------------------------------------ #ADD_DEFINITIONS( -DTEST_FLAG ) ADD_DEFINITIONS(-Wall -Wextra ) # ------------------------------------------------------------------------------ # OPTION # ------------------------------------------------------------------------------ # Since yarock 1.1.5 change default audio engine to VLC OPTION(ENABLE_PHONON "Enable/disable Phonon audio engine" OFF) OPTION(ENABLE_VLC "Enable/disable VLC audio engine" OFF) OPTION(ENABLE_MPV "Enable/disable MPV audio engine" ON) # OPTION(ENABLE_QTMULTIMEDIA "Enable/disable QtMultimedia audio engine" OFF) OPTION(ENABLE_SHORTCUT "Enable/disable global shortcut manager" OFF) # ------------------------------------------------------------------------------ # EXTERNAL PACKAGE # ------------------------------------------------------------------------------ #---- Qt ---- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt6Widgets_EXECUTABLE_COMPILE_FLAGS}") find_package(Qt6Gui REQUIRED) find_package(Qt6Widgets REQUIRED) find_package(Qt6Xml REQUIRED) find_package(Qt6Network REQUIRED) find_package(Qt6Concurrent REQUIRED) find_package(Qt6DBus REQUIRED) find_package(Qt6Sql REQUIRED) find_package(Qt6LinguistTools REQUIRED) set (QTLIBS ${Qt6Core_LIBRARIES} ${Qt6Gui_LIBRARIES} ${Qt6Widgets_LIBRARIES} ${Qt6Network_LIBRARIES} ${Qt6Xml_LIBRARIES} ${Qt6Concurrent_LIBRARIES} ${Qt6DBus_LIBRARIES} ${Qt6Sql_LIBRARIES}) set (QTINCLUDES ${Qt6Core_INCLUDE_DIRS} ${Qt6Gui_INCLUDE_DIRS} ${Qt6Widgets_INCLUDE_DIRS} ${Qt6Network_INCLUDE_DIRS} ${Qt6Xml_INCLUDE_DIRS} ${Qt6Concurrent_INCLUDE_DIRS} ${Qt6DBus_INCLUDE_DIRS} ${Qt6Sql_INCLUDE_DIRS}) add_definitions( ${Qt6Core_DEFINITIONS} ${Qt6Widgets_DEFINITIONS} ${Qt6Network_DEFINITIONS} ${Qt6Xml_DEFINITIONS} ${Qt6Concurrent_DEFINITIONS}) qt_standard_project_setup() # ---- Taglib ---- find_package( Taglib 1.6.0 REQUIRED ) if(TAGLIB_FOUND) include(CheckTagLibFileName) check_taglib_filename(COMPLEX_TAGLIB_FILENAME) endif (TAGLIB_FOUND) # ---- Htmlcxx ---- find_package( HtmlCxx ) # ------------------------------------------------------------------------------ # INCLUDES # ------------------------------------------------------------------------------ INCLUDE_DIRECTORIES( ${QTINCLUDES} ) INCLUDE_DIRECTORIES( ${TAGLIB_INCLUDES} ) INCLUDE_DIRECTORIES( ${HTMLCXX_INCLUDE_DIRS} ) # ------------------------------------------------------------------------------ # SUBDIRECTORIES # ------------------------------------------------------------------------------ # global shortcut if(ENABLE_SHORTCUT) add_definitions(-DENABLE_SHORTCUT) add_subdirectory(src/shortcuts) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/shortcuts) set(LIB_INTERNAL_STATIC_SHORTCUT yarock_shortchut) endif(ENABLE_SHORTCUT) # ------------------------------------------------------------------------------ # INSTALL DIRECTORIES # ------------------------------------------------------------------------------ if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set (CMAKE_INSTALL_PREFIX /usr CACHE PATH "default install path" FORCE ) endif() set(CMAKE_INSTALL_BIN "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "binaries install path" FORCE) set(CMAKE_INSTALL_LIB "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/yarock" CACHE PATH "libraries install path" FORCE) set(CMAKE_INSTALL_TRANS "${CMAKE_INSTALL_PREFIX}/share/yarock/translations" CACHE PATH "translations install path" FORCE) # ------------------------------------------------------------------------------ # CONFIGURE FILES # ------------------------------------------------------------------------------ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) # ------------------------------------------------------------------------------ # SOURCES # ------------------------------------------------------------------------------ add_subdirectory(src) MESSAGE(STATUS "Audio Engine Vlc................................................. " ${ENABLE_VLC} " [use cmake .. -DENABLE_VLC=ON/OFF]" ) if (ENABLE_VLC) add_definitions(-DENABLE_VLC) add_subdirectory(src/core/player/vlc) endif (ENABLE_VLC) MESSAGE(STATUS "Audio Engine Mpv................................................. " ${ENABLE_MPV} " [use cmake .. -DENABLE_MPV=ON/OFF]") if (ENABLE_MPV) add_definitions(-DENABLE_MPV) add_subdirectory(src/core/player/mpv) endif (ENABLE_MPV) MESSAGE(STATUS "Audio Engine Phonon.............................................. " ${ENABLE_PHONON} " [use cmake .. -DENABLE_PHONON=ON/OFF]") if (ENABLE_PHONON) add_definitions(-DENABLE_PHONON) add_subdirectory(src/core/player/phonon) endif (ENABLE_PHONON) # MESSAGE(STATUS "Audio Engine QtMultimedia........................................ " ${ENABLE_QTMULTIMEDIA} " [use cmake .. -DENABLE_QTMULTIMEDIA=ON/OFF]") # if (ENABLE_QTMULTIMEDIA) # if (ENABLE_QT5) # add_definitions(-DENABLE_QTMULTIMEDIA) # add_subdirectory(src/core/player/qtmultimedia) # else (ENABLE_QT5) # MESSAGE(WARNING "QtMultimedia can be set with QT5") # endif (ENABLE_QT5) # endif (ENABLE_QTMULTIMEDIA) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}) INCLUDE_DIRECTORIES(${YAROCK_INCLUDES}) # ------------------------------------------------------------------------------ # RESSOURCE # ------------------------------------------------------------------------------ SET(YAROCK_RESOURCES yarock.qrc) QT6_ADD_RESOURCES(YAROCK_RESOURCES_RCC ${YAROCK_RESOURCES}) # ------------------------------------------------------------------------------ # DBUS # ------------------------------------------------------------------------------ # MPRIS 2.0 DBUS interfaces qt6_add_dbus_adaptor(YAROCK_SOURCES src/dbus/org.mpris.MediaPlayer2.Player.xml src/dbus/mpris2.h Mpris2 mpris2Player Mpris2Player) qt6_add_dbus_adaptor(YAROCK_SOURCES src/dbus/org.mpris.MediaPlayer2.xml src/dbus/mpris2.h Mpris2 mpris2Root Mpris2Root) # ------------------------------------------------------------------------------ # TRANSLATION # ------------------------------------------------------------------------------ # Handle Translations, take all * files from trans directory. file( GLOB TRANS_FILES ${CMAKE_SOURCE_DIR}/translation/yarock_*.ts) set(TS_FILES ${TRANS_FILES}) SET(UPDATE_TRANSLATIONS OFF) # no ts update #SET(UPDATE_TRANSLATIONS ON) # ts update option (UPDATE_TRANSLATIONS "Update source translation ../translation/*.ts files") set (FILES_TO_TRANSLATE ${FILES_TO_TRANSLATE} ${YAROCK_SOURCES}) if (UPDATE_TRANSLATIONS) QT6_CREATE_TRANSLATION(YAROCK_QM_FILES ${FILES_TO_TRANSLATE} ${TS_FILES}) else (UPDATE_TRANSLATIONS) QT6_ADD_TRANSLATION(YAROCK_QM_FILES ${TS_FILES}) endif (UPDATE_TRANSLATIONS) # ------------------------------------------------------------------------------ # BUILDING # ------------------------------------------------------------------------------ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Woverloaded-virtual -Wall -Wno-sign-compare") ADD_EXECUTABLE(yarock ${YAROCK_SOURCES} ${YAROCK_RESOURCES_RCC} ${YAROCK_QM_FILES}) SET_TARGET_PROPERTIES(yarock PROPERTIES AUTOMOC TRUE) SET_PROPERTY(TARGET ${LIB_INTERNAL_STATIC_SHORTCUT} PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/shortcuts) if(ENABLE_SHORTCUT) TARGET_LINK_LIBRARIES(yarock ${LIB_INTERNAL_STATIC_SHORTCUT}) endif(ENABLE_SHORTCUT) TARGET_LINK_LIBRARIES(yarock X11 ${QTLIBS} ${TAGLIB_LIBRARIES} ${HTMLCXX_LIBRARIES} ) # ------------------------------------------------------------------------------ # INSTALL # ------------------------------------------------------------------------------ # -- install binary file install( TARGETS yarock DESTINATION ${CMAKE_INSTALL_BIN} ) # -- install translations files install(FILES ${YAROCK_QM_FILES} DESTINATION "${CMAKE_INSTALL_PREFIX}/share/yarock/translations") # -- install destop file install(FILES data/org.yarock.desktop DESTINATION "${CMAKE_INSTALL_PREFIX}/share/applications" ) # -- install appdata file install(FILES data/org.yarock.appdata.xml DESTINATION "${CMAKE_INSTALL_PREFIX}/share/appdata" ) # -- install icons files INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_16x16.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/16x16/apps" RENAME application-x-yarock.png) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_32x32.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/32x32/apps" RENAME application-x-yarock.png) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_48x48.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps" RENAME application-x-yarock.png) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_64x64.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/64x64/apps" RENAME application-x-yarock.png) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_128x128.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/128x128/apps" RENAME application-x-yarock.png) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock.svg DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps" RENAME application-x-yarock.svg) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_48x48.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/pixmaps/" RENAME application-x-yarock.png) # ------------------------------------------------------------------------------ # UN-INSTALL SUPPORT # ------------------------------------------------------------------------------
src/core/player/mpv/CMakeLists.txt
# ------------------------------------------------------------------------------ # MPV PLUGIN CMAKE FILE # ------------------------------------------------------------------------------ cmake_minimum_required(VERSION 3.16) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) project(enginempv) # ------------------------------------------------------------------------------ # build def (QT PLUGIN) # ------------------------------------------------------------------------------ ADD_DEFINITIONS( -Wall ) ADD_DEFINITIONS(-DQT_PLUGIN) ADD_DEFINITIONS(-DQT_NO_DEBUG) ADD_DEFINITIONS(-DQT_SHARED) ADD_DEFINITIONS(-DQT_THREAD) ADD_DEFINITIONS( -DENABLE_MPV ) # ------------------------------------------------------------------------------ # EXTERNAL LIB # ------------------------------------------------------------------------------ FIND_PACKAGE( LIBMPV REQUIRED) # ------------------------------------------------------------------------------ # INCLUDES # ------------------------------------------------------------------------------ INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/core/player/ ${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/core/player/mpv ${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/core/mediaitem ${CMAKE_CURRENT_SOURCE_DIR}/../../../../src ) INCLUDE_DIRECTORIES( ${LIBMPV_INCLUDE_DIR} ) set (QTLIBS ${Qt6Core_LIBRARIES}) set (QTINCLUDES ${Qt6Core_INCLUDE_DIRS}) add_definitions( ${Qt6Core_DEFINITIONS}) qt_standard_project_setup() INCLUDE_DIRECTORIES( ${QTINCLUDES} ) # ------------------------------------------------------------------------------ # SOURCES # ------------------------------------------------------------------------------ SET(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/core/player/mpv/engine_mpv.cpp ) # ------------------------------------------------------------------------------ # BUILDING # ------------------------------------------------------------------------------ set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib ) ADD_LIBRARY( enginempv SHARED ${SOURCES} ) SET_TARGET_PROPERTIES(enginempv PROPERTIES AUTOMOC TRUE) ADD_DEPENDENCIES(enginempv yarock) TARGET_LINK_LIBRARIES(enginempv ${LIBMPV_LIBRARY} ${QTLIBS}) # ------------------------------------------------------------------------------ # INSTALL # ------------------------------------------------------------------------------ if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set (CMAKE_INSTALL_PREFIX /usr CACHE PATH "default install path" FORCE ) endif() set(CMAKE_INSTALL_LIB "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/yarock" CACHE PATH "libraries installation path" FORCE) install(TARGETS enginempv DESTINATION ${CMAKE_INSTALL_LIB} )
I still think has something to do with the c++-17 standard, if I add these in the old code (qt5) I get the same undefined symbol:
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF)
Thanks
-
I use a build directory, and I clean it after each code change:
cd build cmake .. make
I replaced/removed deprecated and obsolete class members and changed the main and plugin cmake files:
CMakeLists.txt
# ------------------------------------------------------------------------------ # YAROCK CMAKE FILE # ------------------------------------------------------------------------------ cmake_minimum_required(VERSION 3.16) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ) PROJECT( yarock ) set(YAROCK_MAJOR_VERSION 1) set(YAROCK_MINOR_VERSION 5) set(YAROCK_PATCH_VERSION 0) set(YAROCK_VERSION "${YAROCK_MAJOR_VERSION}.${YAROCK_MINOR_VERSION}.${YAROCK_PATCH_VERSION}") # ------------------------------------------------------------------------------ # build def # ------------------------------------------------------------------------------ #ADD_DEFINITIONS( -DTEST_FLAG ) ADD_DEFINITIONS(-Wall -Wextra ) # ------------------------------------------------------------------------------ # OPTION # ------------------------------------------------------------------------------ # Since yarock 1.1.5 change default audio engine to VLC OPTION(ENABLE_PHONON "Enable/disable Phonon audio engine" OFF) OPTION(ENABLE_VLC "Enable/disable VLC audio engine" OFF) OPTION(ENABLE_MPV "Enable/disable MPV audio engine" ON) # OPTION(ENABLE_QTMULTIMEDIA "Enable/disable QtMultimedia audio engine" OFF) OPTION(ENABLE_SHORTCUT "Enable/disable global shortcut manager" OFF) # ------------------------------------------------------------------------------ # EXTERNAL PACKAGE # ------------------------------------------------------------------------------ #---- Qt ---- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt6Widgets_EXECUTABLE_COMPILE_FLAGS}") find_package(Qt6Gui REQUIRED) find_package(Qt6Widgets REQUIRED) find_package(Qt6Xml REQUIRED) find_package(Qt6Network REQUIRED) find_package(Qt6Concurrent REQUIRED) find_package(Qt6DBus REQUIRED) find_package(Qt6Sql REQUIRED) find_package(Qt6LinguistTools REQUIRED) set (QTLIBS ${Qt6Core_LIBRARIES} ${Qt6Gui_LIBRARIES} ${Qt6Widgets_LIBRARIES} ${Qt6Network_LIBRARIES} ${Qt6Xml_LIBRARIES} ${Qt6Concurrent_LIBRARIES} ${Qt6DBus_LIBRARIES} ${Qt6Sql_LIBRARIES}) set (QTINCLUDES ${Qt6Core_INCLUDE_DIRS} ${Qt6Gui_INCLUDE_DIRS} ${Qt6Widgets_INCLUDE_DIRS} ${Qt6Network_INCLUDE_DIRS} ${Qt6Xml_INCLUDE_DIRS} ${Qt6Concurrent_INCLUDE_DIRS} ${Qt6DBus_INCLUDE_DIRS} ${Qt6Sql_INCLUDE_DIRS}) add_definitions( ${Qt6Core_DEFINITIONS} ${Qt6Widgets_DEFINITIONS} ${Qt6Network_DEFINITIONS} ${Qt6Xml_DEFINITIONS} ${Qt6Concurrent_DEFINITIONS}) qt_standard_project_setup() # ---- Taglib ---- find_package( Taglib 1.6.0 REQUIRED ) if(TAGLIB_FOUND) include(CheckTagLibFileName) check_taglib_filename(COMPLEX_TAGLIB_FILENAME) endif (TAGLIB_FOUND) # ---- Htmlcxx ---- find_package( HtmlCxx ) # ------------------------------------------------------------------------------ # INCLUDES # ------------------------------------------------------------------------------ INCLUDE_DIRECTORIES( ${QTINCLUDES} ) INCLUDE_DIRECTORIES( ${TAGLIB_INCLUDES} ) INCLUDE_DIRECTORIES( ${HTMLCXX_INCLUDE_DIRS} ) # ------------------------------------------------------------------------------ # SUBDIRECTORIES # ------------------------------------------------------------------------------ # global shortcut if(ENABLE_SHORTCUT) add_definitions(-DENABLE_SHORTCUT) add_subdirectory(src/shortcuts) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/shortcuts) set(LIB_INTERNAL_STATIC_SHORTCUT yarock_shortchut) endif(ENABLE_SHORTCUT) # ------------------------------------------------------------------------------ # INSTALL DIRECTORIES # ------------------------------------------------------------------------------ if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set (CMAKE_INSTALL_PREFIX /usr CACHE PATH "default install path" FORCE ) endif() set(CMAKE_INSTALL_BIN "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "binaries install path" FORCE) set(CMAKE_INSTALL_LIB "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/yarock" CACHE PATH "libraries install path" FORCE) set(CMAKE_INSTALL_TRANS "${CMAKE_INSTALL_PREFIX}/share/yarock/translations" CACHE PATH "translations install path" FORCE) # ------------------------------------------------------------------------------ # CONFIGURE FILES # ------------------------------------------------------------------------------ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) # ------------------------------------------------------------------------------ # SOURCES # ------------------------------------------------------------------------------ add_subdirectory(src) MESSAGE(STATUS "Audio Engine Vlc................................................. " ${ENABLE_VLC} " [use cmake .. -DENABLE_VLC=ON/OFF]" ) if (ENABLE_VLC) add_definitions(-DENABLE_VLC) add_subdirectory(src/core/player/vlc) endif (ENABLE_VLC) MESSAGE(STATUS "Audio Engine Mpv................................................. " ${ENABLE_MPV} " [use cmake .. -DENABLE_MPV=ON/OFF]") if (ENABLE_MPV) add_definitions(-DENABLE_MPV) add_subdirectory(src/core/player/mpv) endif (ENABLE_MPV) MESSAGE(STATUS "Audio Engine Phonon.............................................. " ${ENABLE_PHONON} " [use cmake .. -DENABLE_PHONON=ON/OFF]") if (ENABLE_PHONON) add_definitions(-DENABLE_PHONON) add_subdirectory(src/core/player/phonon) endif (ENABLE_PHONON) # MESSAGE(STATUS "Audio Engine QtMultimedia........................................ " ${ENABLE_QTMULTIMEDIA} " [use cmake .. -DENABLE_QTMULTIMEDIA=ON/OFF]") # if (ENABLE_QTMULTIMEDIA) # if (ENABLE_QT5) # add_definitions(-DENABLE_QTMULTIMEDIA) # add_subdirectory(src/core/player/qtmultimedia) # else (ENABLE_QT5) # MESSAGE(WARNING "QtMultimedia can be set with QT5") # endif (ENABLE_QT5) # endif (ENABLE_QTMULTIMEDIA) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}) INCLUDE_DIRECTORIES(${YAROCK_INCLUDES}) # ------------------------------------------------------------------------------ # RESSOURCE # ------------------------------------------------------------------------------ SET(YAROCK_RESOURCES yarock.qrc) QT6_ADD_RESOURCES(YAROCK_RESOURCES_RCC ${YAROCK_RESOURCES}) # ------------------------------------------------------------------------------ # DBUS # ------------------------------------------------------------------------------ # MPRIS 2.0 DBUS interfaces qt6_add_dbus_adaptor(YAROCK_SOURCES src/dbus/org.mpris.MediaPlayer2.Player.xml src/dbus/mpris2.h Mpris2 mpris2Player Mpris2Player) qt6_add_dbus_adaptor(YAROCK_SOURCES src/dbus/org.mpris.MediaPlayer2.xml src/dbus/mpris2.h Mpris2 mpris2Root Mpris2Root) # ------------------------------------------------------------------------------ # TRANSLATION # ------------------------------------------------------------------------------ # Handle Translations, take all * files from trans directory. file( GLOB TRANS_FILES ${CMAKE_SOURCE_DIR}/translation/yarock_*.ts) set(TS_FILES ${TRANS_FILES}) SET(UPDATE_TRANSLATIONS OFF) # no ts update #SET(UPDATE_TRANSLATIONS ON) # ts update option (UPDATE_TRANSLATIONS "Update source translation ../translation/*.ts files") set (FILES_TO_TRANSLATE ${FILES_TO_TRANSLATE} ${YAROCK_SOURCES}) if (UPDATE_TRANSLATIONS) QT6_CREATE_TRANSLATION(YAROCK_QM_FILES ${FILES_TO_TRANSLATE} ${TS_FILES}) else (UPDATE_TRANSLATIONS) QT6_ADD_TRANSLATION(YAROCK_QM_FILES ${TS_FILES}) endif (UPDATE_TRANSLATIONS) # ------------------------------------------------------------------------------ # BUILDING # ------------------------------------------------------------------------------ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Woverloaded-virtual -Wall -Wno-sign-compare") ADD_EXECUTABLE(yarock ${YAROCK_SOURCES} ${YAROCK_RESOURCES_RCC} ${YAROCK_QM_FILES}) SET_TARGET_PROPERTIES(yarock PROPERTIES AUTOMOC TRUE) SET_PROPERTY(TARGET ${LIB_INTERNAL_STATIC_SHORTCUT} PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/shortcuts) if(ENABLE_SHORTCUT) TARGET_LINK_LIBRARIES(yarock ${LIB_INTERNAL_STATIC_SHORTCUT}) endif(ENABLE_SHORTCUT) TARGET_LINK_LIBRARIES(yarock X11 ${QTLIBS} ${TAGLIB_LIBRARIES} ${HTMLCXX_LIBRARIES} ) # ------------------------------------------------------------------------------ # INSTALL # ------------------------------------------------------------------------------ # -- install binary file install( TARGETS yarock DESTINATION ${CMAKE_INSTALL_BIN} ) # -- install translations files install(FILES ${YAROCK_QM_FILES} DESTINATION "${CMAKE_INSTALL_PREFIX}/share/yarock/translations") # -- install destop file install(FILES data/org.yarock.desktop DESTINATION "${CMAKE_INSTALL_PREFIX}/share/applications" ) # -- install appdata file install(FILES data/org.yarock.appdata.xml DESTINATION "${CMAKE_INSTALL_PREFIX}/share/appdata" ) # -- install icons files INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_16x16.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/16x16/apps" RENAME application-x-yarock.png) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_32x32.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/32x32/apps" RENAME application-x-yarock.png) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_48x48.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps" RENAME application-x-yarock.png) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_64x64.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/64x64/apps" RENAME application-x-yarock.png) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_128x128.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/128x128/apps" RENAME application-x-yarock.png) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock.svg DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps" RENAME application-x-yarock.svg) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_48x48.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/pixmaps/" RENAME application-x-yarock.png) # ------------------------------------------------------------------------------ # UN-INSTALL SUPPORT # ------------------------------------------------------------------------------
src/core/player/mpv/CMakeLists.txt
# ------------------------------------------------------------------------------ # MPV PLUGIN CMAKE FILE # ------------------------------------------------------------------------------ cmake_minimum_required(VERSION 3.16) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) project(enginempv) # ------------------------------------------------------------------------------ # build def (QT PLUGIN) # ------------------------------------------------------------------------------ ADD_DEFINITIONS( -Wall ) ADD_DEFINITIONS(-DQT_PLUGIN) ADD_DEFINITIONS(-DQT_NO_DEBUG) ADD_DEFINITIONS(-DQT_SHARED) ADD_DEFINITIONS(-DQT_THREAD) ADD_DEFINITIONS( -DENABLE_MPV ) # ------------------------------------------------------------------------------ # EXTERNAL LIB # ------------------------------------------------------------------------------ FIND_PACKAGE( LIBMPV REQUIRED) # ------------------------------------------------------------------------------ # INCLUDES # ------------------------------------------------------------------------------ INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/core/player/ ${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/core/player/mpv ${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/core/mediaitem ${CMAKE_CURRENT_SOURCE_DIR}/../../../../src ) INCLUDE_DIRECTORIES( ${LIBMPV_INCLUDE_DIR} ) set (QTLIBS ${Qt6Core_LIBRARIES}) set (QTINCLUDES ${Qt6Core_INCLUDE_DIRS}) add_definitions( ${Qt6Core_DEFINITIONS}) qt_standard_project_setup() INCLUDE_DIRECTORIES( ${QTINCLUDES} ) # ------------------------------------------------------------------------------ # SOURCES # ------------------------------------------------------------------------------ SET(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/core/player/mpv/engine_mpv.cpp ) # ------------------------------------------------------------------------------ # BUILDING # ------------------------------------------------------------------------------ set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib ) ADD_LIBRARY( enginempv SHARED ${SOURCES} ) SET_TARGET_PROPERTIES(enginempv PROPERTIES AUTOMOC TRUE) ADD_DEPENDENCIES(enginempv yarock) TARGET_LINK_LIBRARIES(enginempv ${LIBMPV_LIBRARY} ${QTLIBS}) # ------------------------------------------------------------------------------ # INSTALL # ------------------------------------------------------------------------------ if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set (CMAKE_INSTALL_PREFIX /usr CACHE PATH "default install path" FORCE ) endif() set(CMAKE_INSTALL_LIB "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/yarock" CACHE PATH "libraries installation path" FORCE) install(TARGETS enginempv DESTINATION ${CMAKE_INSTALL_LIB} )
I still think has something to do with the c++-17 standard, if I add these in the old code (qt5) I get the same undefined symbol:
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF)
Thanks
@sebaro said in Qt6 porting, undefined symbol: _ZN10EngineBase16staticMetaObjectEHi:
I clean it after each code change
And precisely what does that mean? I suggested you delete the build output directory. If something like
make clean
that may not be good enough. Just saying, up to you. -
@sebaro said in Qt6 porting, undefined symbol: _ZN10EngineBase16staticMetaObjectEHi:
I clean it after each code change
And precisely what does that mean? I suggested you delete the build output directory. If something like
make clean
that may not be good enough. Just saying, up to you. -
I delete the content of build directory, I don't use make clean. Every cmake/make is with an empty build directory.
-
Simplify your testcase until you find the bug or you can post it here.
-
I use a build directory, and I clean it after each code change:
cd build cmake .. make
I replaced/removed deprecated and obsolete class members and changed the main and plugin cmake files:
CMakeLists.txt
# ------------------------------------------------------------------------------ # YAROCK CMAKE FILE # ------------------------------------------------------------------------------ cmake_minimum_required(VERSION 3.16) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ) PROJECT( yarock ) set(YAROCK_MAJOR_VERSION 1) set(YAROCK_MINOR_VERSION 5) set(YAROCK_PATCH_VERSION 0) set(YAROCK_VERSION "${YAROCK_MAJOR_VERSION}.${YAROCK_MINOR_VERSION}.${YAROCK_PATCH_VERSION}") # ------------------------------------------------------------------------------ # build def # ------------------------------------------------------------------------------ #ADD_DEFINITIONS( -DTEST_FLAG ) ADD_DEFINITIONS(-Wall -Wextra ) # ------------------------------------------------------------------------------ # OPTION # ------------------------------------------------------------------------------ # Since yarock 1.1.5 change default audio engine to VLC OPTION(ENABLE_PHONON "Enable/disable Phonon audio engine" OFF) OPTION(ENABLE_VLC "Enable/disable VLC audio engine" OFF) OPTION(ENABLE_MPV "Enable/disable MPV audio engine" ON) # OPTION(ENABLE_QTMULTIMEDIA "Enable/disable QtMultimedia audio engine" OFF) OPTION(ENABLE_SHORTCUT "Enable/disable global shortcut manager" OFF) # ------------------------------------------------------------------------------ # EXTERNAL PACKAGE # ------------------------------------------------------------------------------ #---- Qt ---- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt6Widgets_EXECUTABLE_COMPILE_FLAGS}") find_package(Qt6Gui REQUIRED) find_package(Qt6Widgets REQUIRED) find_package(Qt6Xml REQUIRED) find_package(Qt6Network REQUIRED) find_package(Qt6Concurrent REQUIRED) find_package(Qt6DBus REQUIRED) find_package(Qt6Sql REQUIRED) find_package(Qt6LinguistTools REQUIRED) set (QTLIBS ${Qt6Core_LIBRARIES} ${Qt6Gui_LIBRARIES} ${Qt6Widgets_LIBRARIES} ${Qt6Network_LIBRARIES} ${Qt6Xml_LIBRARIES} ${Qt6Concurrent_LIBRARIES} ${Qt6DBus_LIBRARIES} ${Qt6Sql_LIBRARIES}) set (QTINCLUDES ${Qt6Core_INCLUDE_DIRS} ${Qt6Gui_INCLUDE_DIRS} ${Qt6Widgets_INCLUDE_DIRS} ${Qt6Network_INCLUDE_DIRS} ${Qt6Xml_INCLUDE_DIRS} ${Qt6Concurrent_INCLUDE_DIRS} ${Qt6DBus_INCLUDE_DIRS} ${Qt6Sql_INCLUDE_DIRS}) add_definitions( ${Qt6Core_DEFINITIONS} ${Qt6Widgets_DEFINITIONS} ${Qt6Network_DEFINITIONS} ${Qt6Xml_DEFINITIONS} ${Qt6Concurrent_DEFINITIONS}) qt_standard_project_setup() # ---- Taglib ---- find_package( Taglib 1.6.0 REQUIRED ) if(TAGLIB_FOUND) include(CheckTagLibFileName) check_taglib_filename(COMPLEX_TAGLIB_FILENAME) endif (TAGLIB_FOUND) # ---- Htmlcxx ---- find_package( HtmlCxx ) # ------------------------------------------------------------------------------ # INCLUDES # ------------------------------------------------------------------------------ INCLUDE_DIRECTORIES( ${QTINCLUDES} ) INCLUDE_DIRECTORIES( ${TAGLIB_INCLUDES} ) INCLUDE_DIRECTORIES( ${HTMLCXX_INCLUDE_DIRS} ) # ------------------------------------------------------------------------------ # SUBDIRECTORIES # ------------------------------------------------------------------------------ # global shortcut if(ENABLE_SHORTCUT) add_definitions(-DENABLE_SHORTCUT) add_subdirectory(src/shortcuts) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/shortcuts) set(LIB_INTERNAL_STATIC_SHORTCUT yarock_shortchut) endif(ENABLE_SHORTCUT) # ------------------------------------------------------------------------------ # INSTALL DIRECTORIES # ------------------------------------------------------------------------------ if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set (CMAKE_INSTALL_PREFIX /usr CACHE PATH "default install path" FORCE ) endif() set(CMAKE_INSTALL_BIN "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "binaries install path" FORCE) set(CMAKE_INSTALL_LIB "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/yarock" CACHE PATH "libraries install path" FORCE) set(CMAKE_INSTALL_TRANS "${CMAKE_INSTALL_PREFIX}/share/yarock/translations" CACHE PATH "translations install path" FORCE) # ------------------------------------------------------------------------------ # CONFIGURE FILES # ------------------------------------------------------------------------------ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) # ------------------------------------------------------------------------------ # SOURCES # ------------------------------------------------------------------------------ add_subdirectory(src) MESSAGE(STATUS "Audio Engine Vlc................................................. " ${ENABLE_VLC} " [use cmake .. -DENABLE_VLC=ON/OFF]" ) if (ENABLE_VLC) add_definitions(-DENABLE_VLC) add_subdirectory(src/core/player/vlc) endif (ENABLE_VLC) MESSAGE(STATUS "Audio Engine Mpv................................................. " ${ENABLE_MPV} " [use cmake .. -DENABLE_MPV=ON/OFF]") if (ENABLE_MPV) add_definitions(-DENABLE_MPV) add_subdirectory(src/core/player/mpv) endif (ENABLE_MPV) MESSAGE(STATUS "Audio Engine Phonon.............................................. " ${ENABLE_PHONON} " [use cmake .. -DENABLE_PHONON=ON/OFF]") if (ENABLE_PHONON) add_definitions(-DENABLE_PHONON) add_subdirectory(src/core/player/phonon) endif (ENABLE_PHONON) # MESSAGE(STATUS "Audio Engine QtMultimedia........................................ " ${ENABLE_QTMULTIMEDIA} " [use cmake .. -DENABLE_QTMULTIMEDIA=ON/OFF]") # if (ENABLE_QTMULTIMEDIA) # if (ENABLE_QT5) # add_definitions(-DENABLE_QTMULTIMEDIA) # add_subdirectory(src/core/player/qtmultimedia) # else (ENABLE_QT5) # MESSAGE(WARNING "QtMultimedia can be set with QT5") # endif (ENABLE_QT5) # endif (ENABLE_QTMULTIMEDIA) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}) INCLUDE_DIRECTORIES(${YAROCK_INCLUDES}) # ------------------------------------------------------------------------------ # RESSOURCE # ------------------------------------------------------------------------------ SET(YAROCK_RESOURCES yarock.qrc) QT6_ADD_RESOURCES(YAROCK_RESOURCES_RCC ${YAROCK_RESOURCES}) # ------------------------------------------------------------------------------ # DBUS # ------------------------------------------------------------------------------ # MPRIS 2.0 DBUS interfaces qt6_add_dbus_adaptor(YAROCK_SOURCES src/dbus/org.mpris.MediaPlayer2.Player.xml src/dbus/mpris2.h Mpris2 mpris2Player Mpris2Player) qt6_add_dbus_adaptor(YAROCK_SOURCES src/dbus/org.mpris.MediaPlayer2.xml src/dbus/mpris2.h Mpris2 mpris2Root Mpris2Root) # ------------------------------------------------------------------------------ # TRANSLATION # ------------------------------------------------------------------------------ # Handle Translations, take all * files from trans directory. file( GLOB TRANS_FILES ${CMAKE_SOURCE_DIR}/translation/yarock_*.ts) set(TS_FILES ${TRANS_FILES}) SET(UPDATE_TRANSLATIONS OFF) # no ts update #SET(UPDATE_TRANSLATIONS ON) # ts update option (UPDATE_TRANSLATIONS "Update source translation ../translation/*.ts files") set (FILES_TO_TRANSLATE ${FILES_TO_TRANSLATE} ${YAROCK_SOURCES}) if (UPDATE_TRANSLATIONS) QT6_CREATE_TRANSLATION(YAROCK_QM_FILES ${FILES_TO_TRANSLATE} ${TS_FILES}) else (UPDATE_TRANSLATIONS) QT6_ADD_TRANSLATION(YAROCK_QM_FILES ${TS_FILES}) endif (UPDATE_TRANSLATIONS) # ------------------------------------------------------------------------------ # BUILDING # ------------------------------------------------------------------------------ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Woverloaded-virtual -Wall -Wno-sign-compare") ADD_EXECUTABLE(yarock ${YAROCK_SOURCES} ${YAROCK_RESOURCES_RCC} ${YAROCK_QM_FILES}) SET_TARGET_PROPERTIES(yarock PROPERTIES AUTOMOC TRUE) SET_PROPERTY(TARGET ${LIB_INTERNAL_STATIC_SHORTCUT} PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/shortcuts) if(ENABLE_SHORTCUT) TARGET_LINK_LIBRARIES(yarock ${LIB_INTERNAL_STATIC_SHORTCUT}) endif(ENABLE_SHORTCUT) TARGET_LINK_LIBRARIES(yarock X11 ${QTLIBS} ${TAGLIB_LIBRARIES} ${HTMLCXX_LIBRARIES} ) # ------------------------------------------------------------------------------ # INSTALL # ------------------------------------------------------------------------------ # -- install binary file install( TARGETS yarock DESTINATION ${CMAKE_INSTALL_BIN} ) # -- install translations files install(FILES ${YAROCK_QM_FILES} DESTINATION "${CMAKE_INSTALL_PREFIX}/share/yarock/translations") # -- install destop file install(FILES data/org.yarock.desktop DESTINATION "${CMAKE_INSTALL_PREFIX}/share/applications" ) # -- install appdata file install(FILES data/org.yarock.appdata.xml DESTINATION "${CMAKE_INSTALL_PREFIX}/share/appdata" ) # -- install icons files INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_16x16.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/16x16/apps" RENAME application-x-yarock.png) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_32x32.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/32x32/apps" RENAME application-x-yarock.png) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_48x48.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps" RENAME application-x-yarock.png) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_64x64.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/64x64/apps" RENAME application-x-yarock.png) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_128x128.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/128x128/apps" RENAME application-x-yarock.png) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock.svg DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps" RENAME application-x-yarock.svg) INSTALL( FILES ${CMAKE_SOURCE_DIR}/icon/yarock_48x48.png DESTINATION "${CMAKE_INSTALL_PREFIX}/share/pixmaps/" RENAME application-x-yarock.png) # ------------------------------------------------------------------------------ # UN-INSTALL SUPPORT # ------------------------------------------------------------------------------
src/core/player/mpv/CMakeLists.txt
# ------------------------------------------------------------------------------ # MPV PLUGIN CMAKE FILE # ------------------------------------------------------------------------------ cmake_minimum_required(VERSION 3.16) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) project(enginempv) # ------------------------------------------------------------------------------ # build def (QT PLUGIN) # ------------------------------------------------------------------------------ ADD_DEFINITIONS( -Wall ) ADD_DEFINITIONS(-DQT_PLUGIN) ADD_DEFINITIONS(-DQT_NO_DEBUG) ADD_DEFINITIONS(-DQT_SHARED) ADD_DEFINITIONS(-DQT_THREAD) ADD_DEFINITIONS( -DENABLE_MPV ) # ------------------------------------------------------------------------------ # EXTERNAL LIB # ------------------------------------------------------------------------------ FIND_PACKAGE( LIBMPV REQUIRED) # ------------------------------------------------------------------------------ # INCLUDES # ------------------------------------------------------------------------------ INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/core/player/ ${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/core/player/mpv ${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/core/mediaitem ${CMAKE_CURRENT_SOURCE_DIR}/../../../../src ) INCLUDE_DIRECTORIES( ${LIBMPV_INCLUDE_DIR} ) set (QTLIBS ${Qt6Core_LIBRARIES}) set (QTINCLUDES ${Qt6Core_INCLUDE_DIRS}) add_definitions( ${Qt6Core_DEFINITIONS}) qt_standard_project_setup() INCLUDE_DIRECTORIES( ${QTINCLUDES} ) # ------------------------------------------------------------------------------ # SOURCES # ------------------------------------------------------------------------------ SET(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/core/player/mpv/engine_mpv.cpp ) # ------------------------------------------------------------------------------ # BUILDING # ------------------------------------------------------------------------------ set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib ) ADD_LIBRARY( enginempv SHARED ${SOURCES} ) SET_TARGET_PROPERTIES(enginempv PROPERTIES AUTOMOC TRUE) ADD_DEPENDENCIES(enginempv yarock) TARGET_LINK_LIBRARIES(enginempv ${LIBMPV_LIBRARY} ${QTLIBS}) # ------------------------------------------------------------------------------ # INSTALL # ------------------------------------------------------------------------------ if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set (CMAKE_INSTALL_PREFIX /usr CACHE PATH "default install path" FORCE ) endif() set(CMAKE_INSTALL_LIB "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/yarock" CACHE PATH "libraries installation path" FORCE) install(TARGETS enginempv DESTINATION ${CMAKE_INSTALL_LIB} )
I still think has something to do with the c++-17 standard, if I add these in the old code (qt5) I get the same undefined symbol:
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF)
Thanks
-
Automoc was set to true, added CMAKE_AUTOMOC:
set(CMAKE_AUTOMOC ON) qt_standard_project_setup() SET_TARGET_PROPERTIES(enginempv PROPERTIES AUTOMOC TRUE)
It's in the build progress "Automatic MOC and UIC":
[ 98%] Built target enginempv_autogen_timestamp_deps [ 98%] Automatic MOC and UIC for target enginempv [ 98%] Built target enginempv_autogen [ 99%] Building CXX object src/core/player/mpv/CMakeFiles/enginempv.dir/engine_mpv.cpp.o [ 99%] Building CXX object src/core/player/mpv/CMakeFiles/enginempv.dir/enginempv_autogen/mocs_compilation.cpp.o [100%] Linking CXX shared library ../../../../lib/libenginempv.so [100%] Built target enginempv
c++filt _ZN10EngineBase16staticMetaObjectE EngineBase::staticMetaObject
I see the moc files are generated and they contain EngineBase::staticMetaObject:
moc_engine_base.cpp
/**************************************************************************** ** Meta object code from reading C++ file 'engine_base.h' ** ** Created by: The Qt Meta Object Compiler version 68 (Qt 6.7.0) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "../../../src/core/player/engine_base.h" #include <QtCore/qmetatype.h> #include <QtCore/qtmochelpers.h> #include <memory> #include <QtCore/qxptype_traits.h> #if !defined(Q_MOC_OUTPUT_REVISION) #error "The header file 'engine_base.h' doesn't include <QObject>." #elif Q_MOC_OUTPUT_REVISION != 68 #error "This file was generated using the moc from 6.7.0. It" #error "cannot be used with the include files from this version of Qt." #error "(The moc has changed too much.)" #endif #ifndef Q_CONSTINIT #define Q_CONSTINIT #endif QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_GCC("-Wuseless-cast") namespace { #ifdef QT_MOC_HAS_STRINGDATA struct qt_meta_stringdata_CLASSEngineBaseENDCLASS_t {}; constexpr auto qt_meta_stringdata_CLASSEngineBaseENDCLASS = QtMocHelpers::stringData( "EngineBase", "mediaChanged", "", "mediaMetaDataChanged", "mediaAboutToFinish", "mediaFinished", "mediaTick", "time", "mediaTotalTimeChanged", "newTotalTime", "mediaSeekableChanged", "engineQueueFinished", "engineStateChanged", "engineRequestStop", "volumeChanged", "muteStateChanged", "volumeMute", "volumeInc", "volumeDec" ); #else // !QT_MOC_HAS_STRINGDATA #error "qtmochelpers.h not found or too old." #endif // !QT_MOC_HAS_STRINGDATA } // unnamed namespace Q_CONSTINIT static const uint qt_meta_data_CLASSEngineBaseENDCLASS[] = { // content: 12, // revision 0, // classname 0, 0, // classinfo 15, 14, // methods 0, 0, // properties 0, 0, // enums/sets 0, 0, // constructors 0, // flags 12, // signalCount // signals: name, argc, parameters, tag, flags, initial metatype offsets 1, 0, 104, 2, 0x06, 1 /* Public */, 3, 0, 105, 2, 0x06, 2 /* Public */, 4, 0, 106, 2, 0x06, 3 /* Public */, 5, 0, 107, 2, 0x06, 4 /* Public */, 6, 1, 108, 2, 0x06, 5 /* Public */, 8, 1, 111, 2, 0x06, 7 /* Public */, 10, 1, 114, 2, 0x06, 9 /* Public */, 11, 0, 117, 2, 0x06, 11 /* Public */, 12, 0, 118, 2, 0x06, 12 /* Public */, 13, 0, 119, 2, 0x06, 13 /* Public */, 14, 0, 120, 2, 0x06, 14 /* Public */, 15, 0, 121, 2, 0x06, 15 /* Public */, // slots: name, argc, parameters, tag, flags, initial metatype offsets 16, 0, 122, 2, 0x0a, 16 /* Public */, 17, 0, 123, 2, 0x0a, 17 /* Public */, 18, 0, 124, 2, 0x0a, 18 /* Public */, // signals: parameters QMetaType::Void, QMetaType::Void, QMetaType::Void, QMetaType::Void, QMetaType::Void, QMetaType::LongLong, 7, QMetaType::Void, QMetaType::LongLong, 9, QMetaType::Void, QMetaType::Bool, 2, QMetaType::Void, QMetaType::Void, QMetaType::Void, QMetaType::Void, QMetaType::Void, // slots: parameters QMetaType::Void, QMetaType::Void, QMetaType::Void, 0 // eod }; Q_CONSTINIT const QMetaObject EngineBase::staticMetaObject = { { QMetaObject::SuperData::link<QObject::staticMetaObject>(), qt_meta_stringdata_CLASSEngineBaseENDCLASS.offsetsAndSizes, qt_meta_data_CLASSEngineBaseENDCLASS, qt_static_metacall, nullptr, qt_incomplete_metaTypeArray<qt_meta_stringdata_CLASSEngineBaseENDCLASS_t, // Q_OBJECT / Q_GADGET QtPrivate::TypeAndForceComplete<EngineBase, std::true_type>, // method 'mediaChanged' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'mediaMetaDataChanged' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'mediaAboutToFinish' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'mediaFinished' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'mediaTick' QtPrivate::TypeAndForceComplete<void, std::false_type>, QtPrivate::TypeAndForceComplete<qint64, std::false_type>, // method 'mediaTotalTimeChanged' QtPrivate::TypeAndForceComplete<void, std::false_type>, QtPrivate::TypeAndForceComplete<qint64, std::false_type>, // method 'mediaSeekableChanged' QtPrivate::TypeAndForceComplete<void, std::false_type>, QtPrivate::TypeAndForceComplete<bool, std::false_type>, // method 'engineQueueFinished' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'engineStateChanged' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'engineRequestStop' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'volumeChanged' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'muteStateChanged' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'volumeMute' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'volumeInc' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'volumeDec' QtPrivate::TypeAndForceComplete<void, std::false_type> >, nullptr } }; void EngineBase::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { auto *_t = static_cast<EngineBase *>(_o); (void)_t; switch (_id) { case 0: _t->mediaChanged(); break; case 1: _t->mediaMetaDataChanged(); break; case 2: _t->mediaAboutToFinish(); break; case 3: _t->mediaFinished(); break; case 4: _t->mediaTick((*reinterpret_cast< std::add_pointer_t<qint64>>(_a[1]))); break; case 5: _t->mediaTotalTimeChanged((*reinterpret_cast< std::add_pointer_t<qint64>>(_a[1]))); break; case 6: _t->mediaSeekableChanged((*reinterpret_cast< std::add_pointer_t<bool>>(_a[1]))); break; case 7: _t->engineQueueFinished(); break; case 8: _t->engineStateChanged(); break; case 9: _t->engineRequestStop(); break; case 10: _t->volumeChanged(); break; case 11: _t->muteStateChanged(); break; case 12: _t->volumeMute(); break; case 13: _t->volumeInc(); break; case 14: _t->volumeDec(); break; default: ; } } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast<int *>(_a[0]); { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::mediaChanged; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 0; return; } } { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::mediaMetaDataChanged; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 1; return; } } { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::mediaAboutToFinish; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 2; return; } } { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::mediaFinished; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 3; return; } } { using _t = void (EngineBase::*)(qint64 ); if (_t _q_method = &EngineBase::mediaTick; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 4; return; } } { using _t = void (EngineBase::*)(qint64 ); if (_t _q_method = &EngineBase::mediaTotalTimeChanged; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 5; return; } } { using _t = void (EngineBase::*)(bool ); if (_t _q_method = &EngineBase::mediaSeekableChanged; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 6; return; } } { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::engineQueueFinished; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 7; return; } } { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::engineStateChanged; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 8; return; } } { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::engineRequestStop; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 9; return; } } { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::volumeChanged; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 10; return; } } { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::muteStateChanged; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 11; return; } } } } const QMetaObject *EngineBase::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } void *EngineBase::qt_metacast(const char *_clname) { if (!_clname) return nullptr; if (!strcmp(_clname, qt_meta_stringdata_CLASSEngineBaseENDCLASS.stringdata0)) return static_cast<void*>(this); return QObject::qt_metacast(_clname); } int EngineBase::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QObject::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { if (_id < 15) qt_static_metacall(this, _c, _id, _a); _id -= 15; } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { if (_id < 15) *reinterpret_cast<QMetaType *>(_a[0]) = QMetaType(); _id -= 15; } return _id; } // SIGNAL 0 void EngineBase::mediaChanged() { QMetaObject::activate(this, &staticMetaObject, 0, nullptr); } // SIGNAL 1 void EngineBase::mediaMetaDataChanged() { QMetaObject::activate(this, &staticMetaObject, 1, nullptr); } // SIGNAL 2 void EngineBase::mediaAboutToFinish() { QMetaObject::activate(this, &staticMetaObject, 2, nullptr); } // SIGNAL 3 void EngineBase::mediaFinished() { QMetaObject::activate(this, &staticMetaObject, 3, nullptr); } // SIGNAL 4 void EngineBase::mediaTick(qint64 _t1) { void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t1))) }; QMetaObject::activate(this, &staticMetaObject, 4, _a); } // SIGNAL 5 void EngineBase::mediaTotalTimeChanged(qint64 _t1) { void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t1))) }; QMetaObject::activate(this, &staticMetaObject, 5, _a); } // SIGNAL 6 void EngineBase::mediaSeekableChanged(bool _t1) { void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t1))) }; QMetaObject::activate(this, &staticMetaObject, 6, _a); } // SIGNAL 7 void EngineBase::engineQueueFinished() { QMetaObject::activate(this, &staticMetaObject, 7, nullptr); } // SIGNAL 8 void EngineBase::engineStateChanged() { QMetaObject::activate(this, &staticMetaObject, 8, nullptr); } // SIGNAL 9 void EngineBase::engineRequestStop() { QMetaObject::activate(this, &staticMetaObject, 9, nullptr); } // SIGNAL 10 void EngineBase::volumeChanged() { QMetaObject::activate(this, &staticMetaObject, 10, nullptr); } // SIGNAL 11 void EngineBase::muteStateChanged() { QMetaObject::activate(this, &staticMetaObject, 11, nullptr); } QT_WARNING_POP
moc_engine_mpv.cpp
/**************************************************************************** ** Meta object code from reading C++ file 'engine_mpv.h' ** ** Created by: The Qt Meta Object Compiler version 68 (Qt 6.7.0) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "../../../../../../../src/core/player/mpv/engine_mpv.h" #include <QtCore/qmetatype.h> #include <QtCore/qplugin.h> #include <QtCore/qtmochelpers.h> #include <memory> #include <QtCore/qxptype_traits.h> #if !defined(Q_MOC_OUTPUT_REVISION) #error "The header file 'engine_mpv.h' doesn't include <QObject>." #elif Q_MOC_OUTPUT_REVISION != 68 #error "This file was generated using the moc from 6.7.0. It" #error "cannot be used with the include files from this version of Qt." #error "(The moc has changed too much.)" #endif #ifndef Q_CONSTINIT #define Q_CONSTINIT #endif QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_GCC("-Wuseless-cast") namespace { #ifdef QT_MOC_HAS_STRINGDATA struct qt_meta_stringdata_CLASSEngineMpvENDCLASS_t {}; constexpr auto qt_meta_stringdata_CLASSEngineMpvENDCLASS = QtMocHelpers::stringData( "EngineMpv", "volumeMute", "", "volumeInc", "volumeDec" ); #else // !QT_MOC_HAS_STRINGDATA #error "qtmochelpers.h not found or too old." #endif // !QT_MOC_HAS_STRINGDATA } // unnamed namespace Q_CONSTINIT static const uint qt_meta_data_CLASSEngineMpvENDCLASS[] = { // content: 12, // revision 0, // classname 0, 0, // classinfo 3, 14, // methods 0, 0, // properties 0, 0, // enums/sets 0, 0, // constructors 0, // flags 0, // signalCount // slots: name, argc, parameters, tag, flags, initial metatype offsets 1, 0, 32, 2, 0x0a, 1 /* Public */, 3, 0, 33, 2, 0x0a, 2 /* Public */, 4, 0, 34, 2, 0x0a, 3 /* Public */, // slots: parameters QMetaType::Void, QMetaType::Void, QMetaType::Void, 0 // eod }; Q_CONSTINIT const QMetaObject EngineMpv::staticMetaObject = { { QMetaObject::SuperData::link<EngineBase::staticMetaObject>(), qt_meta_stringdata_CLASSEngineMpvENDCLASS.offsetsAndSizes, qt_meta_data_CLASSEngineMpvENDCLASS, qt_static_metacall, nullptr, qt_incomplete_metaTypeArray<qt_meta_stringdata_CLASSEngineMpvENDCLASS_t, // Q_OBJECT / Q_GADGET QtPrivate::TypeAndForceComplete<EngineMpv, std::true_type>, // method 'volumeMute' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'volumeInc' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'volumeDec' QtPrivate::TypeAndForceComplete<void, std::false_type> >, nullptr } }; void EngineMpv::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { auto *_t = static_cast<EngineMpv *>(_o); (void)_t; switch (_id) { case 0: _t->volumeMute(); break; case 1: _t->volumeInc(); break; case 2: _t->volumeDec(); break; default: ; } } (void)_a; } const QMetaObject *EngineMpv::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } void *EngineMpv::qt_metacast(const char *_clname) { if (!_clname) return nullptr; if (!strcmp(_clname, qt_meta_stringdata_CLASSEngineMpvENDCLASS.stringdata0)) return static_cast<void*>(this); if (!strcmp(_clname, "yarock.EngineBase/1.0")) return static_cast< EngineBase*>(this); return EngineBase::qt_metacast(_clname); } int EngineMpv::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = EngineBase::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { if (_id < 3) qt_static_metacall(this, _c, _id, _a); _id -= 3; } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { if (_id < 3) *reinterpret_cast<QMetaType *>(_a[0]) = QMetaType(); _id -= 3; } return _id; } #ifdef QT_MOC_EXPORT_PLUGIN_V2 static constexpr unsigned char qt_pluginMetaDataV2_EngineMpv[] = { 0xbf, // "IID" 0x02, 0x69, 'E', 'n', 'g', 'i', 'n', 'e', 'M', 'p', 'v', // "className" 0x03, 0x69, 'E', 'n', 'g', 'i', 'n', 'e', 'M', 'p', 'v', 0xff, }; QT_MOC_EXPORT_PLUGIN_V2(EngineMpv, EngineMpv, qt_pluginMetaDataV2_EngineMpv) #else QT_PLUGIN_METADATA_SECTION Q_CONSTINIT static constexpr unsigned char qt_pluginMetaData_EngineMpv[] = { 'Q', 'T', 'M', 'E', 'T', 'A', 'D', 'A', 'T', 'A', ' ', '!', // metadata version, Qt version, architectural requirements 0, QT_VERSION_MAJOR, QT_VERSION_MINOR, qPluginArchRequirements(), 0xbf, // "IID" 0x02, 0x69, 'E', 'n', 'g', 'i', 'n', 'e', 'M', 'p', 'v', // "className" 0x03, 0x69, 'E', 'n', 'g', 'i', 'n', 'e', 'M', 'p', 'v', 0xff, }; QT_MOC_EXPORT_PLUGIN(EngineMpv, EngineMpv) #endif // QT_MOC_EXPORT_PLUGIN_V2 QT_WARNING_POP
-
Automoc was set to true, added CMAKE_AUTOMOC:
set(CMAKE_AUTOMOC ON) qt_standard_project_setup() SET_TARGET_PROPERTIES(enginempv PROPERTIES AUTOMOC TRUE)
It's in the build progress "Automatic MOC and UIC":
[ 98%] Built target enginempv_autogen_timestamp_deps [ 98%] Automatic MOC and UIC for target enginempv [ 98%] Built target enginempv_autogen [ 99%] Building CXX object src/core/player/mpv/CMakeFiles/enginempv.dir/engine_mpv.cpp.o [ 99%] Building CXX object src/core/player/mpv/CMakeFiles/enginempv.dir/enginempv_autogen/mocs_compilation.cpp.o [100%] Linking CXX shared library ../../../../lib/libenginempv.so [100%] Built target enginempv
c++filt _ZN10EngineBase16staticMetaObjectE EngineBase::staticMetaObject
I see the moc files are generated and they contain EngineBase::staticMetaObject:
moc_engine_base.cpp
/**************************************************************************** ** Meta object code from reading C++ file 'engine_base.h' ** ** Created by: The Qt Meta Object Compiler version 68 (Qt 6.7.0) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "../../../src/core/player/engine_base.h" #include <QtCore/qmetatype.h> #include <QtCore/qtmochelpers.h> #include <memory> #include <QtCore/qxptype_traits.h> #if !defined(Q_MOC_OUTPUT_REVISION) #error "The header file 'engine_base.h' doesn't include <QObject>." #elif Q_MOC_OUTPUT_REVISION != 68 #error "This file was generated using the moc from 6.7.0. It" #error "cannot be used with the include files from this version of Qt." #error "(The moc has changed too much.)" #endif #ifndef Q_CONSTINIT #define Q_CONSTINIT #endif QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_GCC("-Wuseless-cast") namespace { #ifdef QT_MOC_HAS_STRINGDATA struct qt_meta_stringdata_CLASSEngineBaseENDCLASS_t {}; constexpr auto qt_meta_stringdata_CLASSEngineBaseENDCLASS = QtMocHelpers::stringData( "EngineBase", "mediaChanged", "", "mediaMetaDataChanged", "mediaAboutToFinish", "mediaFinished", "mediaTick", "time", "mediaTotalTimeChanged", "newTotalTime", "mediaSeekableChanged", "engineQueueFinished", "engineStateChanged", "engineRequestStop", "volumeChanged", "muteStateChanged", "volumeMute", "volumeInc", "volumeDec" ); #else // !QT_MOC_HAS_STRINGDATA #error "qtmochelpers.h not found or too old." #endif // !QT_MOC_HAS_STRINGDATA } // unnamed namespace Q_CONSTINIT static const uint qt_meta_data_CLASSEngineBaseENDCLASS[] = { // content: 12, // revision 0, // classname 0, 0, // classinfo 15, 14, // methods 0, 0, // properties 0, 0, // enums/sets 0, 0, // constructors 0, // flags 12, // signalCount // signals: name, argc, parameters, tag, flags, initial metatype offsets 1, 0, 104, 2, 0x06, 1 /* Public */, 3, 0, 105, 2, 0x06, 2 /* Public */, 4, 0, 106, 2, 0x06, 3 /* Public */, 5, 0, 107, 2, 0x06, 4 /* Public */, 6, 1, 108, 2, 0x06, 5 /* Public */, 8, 1, 111, 2, 0x06, 7 /* Public */, 10, 1, 114, 2, 0x06, 9 /* Public */, 11, 0, 117, 2, 0x06, 11 /* Public */, 12, 0, 118, 2, 0x06, 12 /* Public */, 13, 0, 119, 2, 0x06, 13 /* Public */, 14, 0, 120, 2, 0x06, 14 /* Public */, 15, 0, 121, 2, 0x06, 15 /* Public */, // slots: name, argc, parameters, tag, flags, initial metatype offsets 16, 0, 122, 2, 0x0a, 16 /* Public */, 17, 0, 123, 2, 0x0a, 17 /* Public */, 18, 0, 124, 2, 0x0a, 18 /* Public */, // signals: parameters QMetaType::Void, QMetaType::Void, QMetaType::Void, QMetaType::Void, QMetaType::Void, QMetaType::LongLong, 7, QMetaType::Void, QMetaType::LongLong, 9, QMetaType::Void, QMetaType::Bool, 2, QMetaType::Void, QMetaType::Void, QMetaType::Void, QMetaType::Void, QMetaType::Void, // slots: parameters QMetaType::Void, QMetaType::Void, QMetaType::Void, 0 // eod }; Q_CONSTINIT const QMetaObject EngineBase::staticMetaObject = { { QMetaObject::SuperData::link<QObject::staticMetaObject>(), qt_meta_stringdata_CLASSEngineBaseENDCLASS.offsetsAndSizes, qt_meta_data_CLASSEngineBaseENDCLASS, qt_static_metacall, nullptr, qt_incomplete_metaTypeArray<qt_meta_stringdata_CLASSEngineBaseENDCLASS_t, // Q_OBJECT / Q_GADGET QtPrivate::TypeAndForceComplete<EngineBase, std::true_type>, // method 'mediaChanged' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'mediaMetaDataChanged' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'mediaAboutToFinish' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'mediaFinished' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'mediaTick' QtPrivate::TypeAndForceComplete<void, std::false_type>, QtPrivate::TypeAndForceComplete<qint64, std::false_type>, // method 'mediaTotalTimeChanged' QtPrivate::TypeAndForceComplete<void, std::false_type>, QtPrivate::TypeAndForceComplete<qint64, std::false_type>, // method 'mediaSeekableChanged' QtPrivate::TypeAndForceComplete<void, std::false_type>, QtPrivate::TypeAndForceComplete<bool, std::false_type>, // method 'engineQueueFinished' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'engineStateChanged' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'engineRequestStop' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'volumeChanged' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'muteStateChanged' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'volumeMute' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'volumeInc' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'volumeDec' QtPrivate::TypeAndForceComplete<void, std::false_type> >, nullptr } }; void EngineBase::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { auto *_t = static_cast<EngineBase *>(_o); (void)_t; switch (_id) { case 0: _t->mediaChanged(); break; case 1: _t->mediaMetaDataChanged(); break; case 2: _t->mediaAboutToFinish(); break; case 3: _t->mediaFinished(); break; case 4: _t->mediaTick((*reinterpret_cast< std::add_pointer_t<qint64>>(_a[1]))); break; case 5: _t->mediaTotalTimeChanged((*reinterpret_cast< std::add_pointer_t<qint64>>(_a[1]))); break; case 6: _t->mediaSeekableChanged((*reinterpret_cast< std::add_pointer_t<bool>>(_a[1]))); break; case 7: _t->engineQueueFinished(); break; case 8: _t->engineStateChanged(); break; case 9: _t->engineRequestStop(); break; case 10: _t->volumeChanged(); break; case 11: _t->muteStateChanged(); break; case 12: _t->volumeMute(); break; case 13: _t->volumeInc(); break; case 14: _t->volumeDec(); break; default: ; } } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast<int *>(_a[0]); { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::mediaChanged; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 0; return; } } { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::mediaMetaDataChanged; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 1; return; } } { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::mediaAboutToFinish; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 2; return; } } { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::mediaFinished; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 3; return; } } { using _t = void (EngineBase::*)(qint64 ); if (_t _q_method = &EngineBase::mediaTick; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 4; return; } } { using _t = void (EngineBase::*)(qint64 ); if (_t _q_method = &EngineBase::mediaTotalTimeChanged; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 5; return; } } { using _t = void (EngineBase::*)(bool ); if (_t _q_method = &EngineBase::mediaSeekableChanged; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 6; return; } } { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::engineQueueFinished; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 7; return; } } { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::engineStateChanged; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 8; return; } } { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::engineRequestStop; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 9; return; } } { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::volumeChanged; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 10; return; } } { using _t = void (EngineBase::*)(); if (_t _q_method = &EngineBase::muteStateChanged; *reinterpret_cast<_t *>(_a[1]) == _q_method) { *result = 11; return; } } } } const QMetaObject *EngineBase::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } void *EngineBase::qt_metacast(const char *_clname) { if (!_clname) return nullptr; if (!strcmp(_clname, qt_meta_stringdata_CLASSEngineBaseENDCLASS.stringdata0)) return static_cast<void*>(this); return QObject::qt_metacast(_clname); } int EngineBase::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QObject::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { if (_id < 15) qt_static_metacall(this, _c, _id, _a); _id -= 15; } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { if (_id < 15) *reinterpret_cast<QMetaType *>(_a[0]) = QMetaType(); _id -= 15; } return _id; } // SIGNAL 0 void EngineBase::mediaChanged() { QMetaObject::activate(this, &staticMetaObject, 0, nullptr); } // SIGNAL 1 void EngineBase::mediaMetaDataChanged() { QMetaObject::activate(this, &staticMetaObject, 1, nullptr); } // SIGNAL 2 void EngineBase::mediaAboutToFinish() { QMetaObject::activate(this, &staticMetaObject, 2, nullptr); } // SIGNAL 3 void EngineBase::mediaFinished() { QMetaObject::activate(this, &staticMetaObject, 3, nullptr); } // SIGNAL 4 void EngineBase::mediaTick(qint64 _t1) { void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t1))) }; QMetaObject::activate(this, &staticMetaObject, 4, _a); } // SIGNAL 5 void EngineBase::mediaTotalTimeChanged(qint64 _t1) { void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t1))) }; QMetaObject::activate(this, &staticMetaObject, 5, _a); } // SIGNAL 6 void EngineBase::mediaSeekableChanged(bool _t1) { void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t1))) }; QMetaObject::activate(this, &staticMetaObject, 6, _a); } // SIGNAL 7 void EngineBase::engineQueueFinished() { QMetaObject::activate(this, &staticMetaObject, 7, nullptr); } // SIGNAL 8 void EngineBase::engineStateChanged() { QMetaObject::activate(this, &staticMetaObject, 8, nullptr); } // SIGNAL 9 void EngineBase::engineRequestStop() { QMetaObject::activate(this, &staticMetaObject, 9, nullptr); } // SIGNAL 10 void EngineBase::volumeChanged() { QMetaObject::activate(this, &staticMetaObject, 10, nullptr); } // SIGNAL 11 void EngineBase::muteStateChanged() { QMetaObject::activate(this, &staticMetaObject, 11, nullptr); } QT_WARNING_POP
moc_engine_mpv.cpp
/**************************************************************************** ** Meta object code from reading C++ file 'engine_mpv.h' ** ** Created by: The Qt Meta Object Compiler version 68 (Qt 6.7.0) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "../../../../../../../src/core/player/mpv/engine_mpv.h" #include <QtCore/qmetatype.h> #include <QtCore/qplugin.h> #include <QtCore/qtmochelpers.h> #include <memory> #include <QtCore/qxptype_traits.h> #if !defined(Q_MOC_OUTPUT_REVISION) #error "The header file 'engine_mpv.h' doesn't include <QObject>." #elif Q_MOC_OUTPUT_REVISION != 68 #error "This file was generated using the moc from 6.7.0. It" #error "cannot be used with the include files from this version of Qt." #error "(The moc has changed too much.)" #endif #ifndef Q_CONSTINIT #define Q_CONSTINIT #endif QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_GCC("-Wuseless-cast") namespace { #ifdef QT_MOC_HAS_STRINGDATA struct qt_meta_stringdata_CLASSEngineMpvENDCLASS_t {}; constexpr auto qt_meta_stringdata_CLASSEngineMpvENDCLASS = QtMocHelpers::stringData( "EngineMpv", "volumeMute", "", "volumeInc", "volumeDec" ); #else // !QT_MOC_HAS_STRINGDATA #error "qtmochelpers.h not found or too old." #endif // !QT_MOC_HAS_STRINGDATA } // unnamed namespace Q_CONSTINIT static const uint qt_meta_data_CLASSEngineMpvENDCLASS[] = { // content: 12, // revision 0, // classname 0, 0, // classinfo 3, 14, // methods 0, 0, // properties 0, 0, // enums/sets 0, 0, // constructors 0, // flags 0, // signalCount // slots: name, argc, parameters, tag, flags, initial metatype offsets 1, 0, 32, 2, 0x0a, 1 /* Public */, 3, 0, 33, 2, 0x0a, 2 /* Public */, 4, 0, 34, 2, 0x0a, 3 /* Public */, // slots: parameters QMetaType::Void, QMetaType::Void, QMetaType::Void, 0 // eod }; Q_CONSTINIT const QMetaObject EngineMpv::staticMetaObject = { { QMetaObject::SuperData::link<EngineBase::staticMetaObject>(), qt_meta_stringdata_CLASSEngineMpvENDCLASS.offsetsAndSizes, qt_meta_data_CLASSEngineMpvENDCLASS, qt_static_metacall, nullptr, qt_incomplete_metaTypeArray<qt_meta_stringdata_CLASSEngineMpvENDCLASS_t, // Q_OBJECT / Q_GADGET QtPrivate::TypeAndForceComplete<EngineMpv, std::true_type>, // method 'volumeMute' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'volumeInc' QtPrivate::TypeAndForceComplete<void, std::false_type>, // method 'volumeDec' QtPrivate::TypeAndForceComplete<void, std::false_type> >, nullptr } }; void EngineMpv::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { auto *_t = static_cast<EngineMpv *>(_o); (void)_t; switch (_id) { case 0: _t->volumeMute(); break; case 1: _t->volumeInc(); break; case 2: _t->volumeDec(); break; default: ; } } (void)_a; } const QMetaObject *EngineMpv::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } void *EngineMpv::qt_metacast(const char *_clname) { if (!_clname) return nullptr; if (!strcmp(_clname, qt_meta_stringdata_CLASSEngineMpvENDCLASS.stringdata0)) return static_cast<void*>(this); if (!strcmp(_clname, "yarock.EngineBase/1.0")) return static_cast< EngineBase*>(this); return EngineBase::qt_metacast(_clname); } int EngineMpv::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = EngineBase::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { if (_id < 3) qt_static_metacall(this, _c, _id, _a); _id -= 3; } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { if (_id < 3) *reinterpret_cast<QMetaType *>(_a[0]) = QMetaType(); _id -= 3; } return _id; } #ifdef QT_MOC_EXPORT_PLUGIN_V2 static constexpr unsigned char qt_pluginMetaDataV2_EngineMpv[] = { 0xbf, // "IID" 0x02, 0x69, 'E', 'n', 'g', 'i', 'n', 'e', 'M', 'p', 'v', // "className" 0x03, 0x69, 'E', 'n', 'g', 'i', 'n', 'e', 'M', 'p', 'v', 0xff, }; QT_MOC_EXPORT_PLUGIN_V2(EngineMpv, EngineMpv, qt_pluginMetaDataV2_EngineMpv) #else QT_PLUGIN_METADATA_SECTION Q_CONSTINIT static constexpr unsigned char qt_pluginMetaData_EngineMpv[] = { 'Q', 'T', 'M', 'E', 'T', 'A', 'D', 'A', 'T', 'A', ' ', '!', // metadata version, Qt version, architectural requirements 0, QT_VERSION_MAJOR, QT_VERSION_MINOR, qPluginArchRequirements(), 0xbf, // "IID" 0x02, 0x69, 'E', 'n', 'g', 'i', 'n', 'e', 'M', 'p', 'v', // "className" 0x03, 0x69, 'E', 'n', 'g', 'i', 'n', 'e', 'M', 'p', 'v', 0xff, }; QT_MOC_EXPORT_PLUGIN(EngineMpv, EngineMpv) #endif // QT_MOC_EXPORT_PLUGIN_V2 QT_WARNING_POP
-
Changing to the previous minimum required version of cmake fixes this:
CMakeLists.txt
cmake_minimum_required(VERSION 2.8.6) #cmake_minimum_required(VERSION 3.16)
src/core/player/mpv/CMakeLists.txt
cmake_minimum_required(VERSION 2.6) #cmake_minimum_required(VERSION 3.16)
Seems to be this policy:
https://cmake.org/cmake/help/latest/policy/CMP0065.htmlThis fixed the issue with cmake 3.4+:
set_target_properties(yarock PROPERTIES ENABLE_EXPORTS TRUE)
-
S sebaro has marked this topic as solved on