Details
-
User Story
-
Resolution: Done
-
P2: Important
-
None
-
None
-
None
-
-
5f160a3699d80d1736f691ad9ef774eb6aa28079 (qt/qtbase/dev)
Description
When building qtdeclarative as static libraries with Qt6 + CMake
you get duplicate symbol errors like:
inking CXX executable /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/bin/qmlprofiler FAILED: /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/bin/qmlprofiler : && /usr/bin/c++ -g tools/qmlprofiler/CMakeFiles/qmlprofiler.dir/qmlprofiler_autogen/mocs_compilation.cpp.o tools/qmlprofiler/CMakeFiles/qmlprofiler.dir/commandlistener.cpp.o tools/qmlprofiler/CMakeFiles/qmlprofiler.dir/main.cpp.o tools/qmlprofiler/CMakeFiles/qmlprofiler.dir/qmlprofilerapplication.cpp.o tools/qmlprofiler/CMakeFiles/qmlprofiler.dir/qmlprofilerclient.cpp.o tools/qmlprofiler/CMakeFiles/qmlprofiler.dir/qmlprofilerdata.cpp.o tools/qmlprofiler/CMakeFiles/qmlprofiler.dir/__/__/qt_Network_qgenericbearer.cpp.o tools/qmlprofiler/CMakeFiles/qmlprofiler.dir/__/__/qt_Network_qconnmanbearer.cpp.o tools/qmlprofiler/CMakeFiles/qmlprofiler.dir/__/__/qt_Network_qnmbearer.cpp.o -o /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/bin/qmlprofiler -Wl,-rpath,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/lib/libQt6Core.a /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/lib/libQt6QmlDebug.a /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/lib/libQt6QmlDebug.a /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/lib/libQt6Network.a /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/plugins/bearer/libqgenericbearer.a /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/plugins/bearer/libqconnmanbearer.a /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/plugins/bearer/libqnmbearer.a /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/lib/libQt6Network.a /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/plugins/bearer/libqgenericbearer.a /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/plugins/bearer/libqconnmanbearer.a /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/plugins/bearer/libqnmbearer.a -lgssapi_krb5 /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/lib/libQt6DBus.a /usr/lib/x86_64-linux-gnu/libdbus-1.so /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/lib/libQt6PacketProtocol.a /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/lib/libQt6Core.a /usr/lib/x86_64-linux-gnu/libz.so /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/src/3rdparty/harfbuzz/libQtHarfBuzz.a -lpthread /usr/lib/x86_64-linux-gnu/libdouble-conversion.so -lm /usr/lib/x86_64-linux-gnu/libicui18n.so /usr/lib/x86_64-linux-gnu/libicuuc.so /usr/lib/x86_64-linux-gnu/libicudata.so /usr/lib/x86_64-linux-gnu/libpcre2-16.so /usr/lib/x86_64-linux-gnu/libzstd.so -ldl /usr/lib/x86_64-linux-gnu/libglib-2.0.so /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/src/corelib/CMakeFiles/Core_resources_mimetypes.dir/.rcc/qrc_mimetypes.cpp.o && : /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/plugins/bearer/libqconnmanbearer.a(mocs_compilation.cpp.o):(.data.rel.ro+0x200): multiple definition of `QBearerEngineImpl::staticMetaObject' /home/alex/Dev/qt/qt5_cmake/qtbase_built_static_developer/plugins/bearer/libqgenericbearer.a(mocs_compilation.cpp.o):(.data.rel.ro+0x0): first defined here
With qmake it coincidentally works, because the linker discards the symbols. The command line for qmake is:
g++ -Wl,--enable-new-dtags -Wl,--gc-sections -o /home/alex/Dev/qt/qt514_built_static/qtbase/bin/qmlprofiler .obj/main.o .obj/qmlprofilerapplication.o .obj/commandlistener.o .obj/qmlprofilerdata.o .obj/qmlprofilerclient.o .obj/qmlprofiler_plugin_import.o .obj/moc_qmlprofilerapplication.o /home/alex/Dev/qt/qt514_built_static/qtbase/plugins/bearer/libqconnmanbearer.a /home/alex/Dev/qt/qt514_built_static/qtbase/plugins/bearer/libqgenericbearer.a /home/alex/Dev/qt/qt514_built_static/qtbase/plugins/bearer/libqnmbearer.a /home/alex/Dev/qt/qt514_built_static/qtbase/lib/libQt5DBus.a /usr/lib/x86_64-linux-gnu/libdbus-1.so /home/alex/Dev/qt/qt514_built_static/qtbase/lib/libQt5QmlDebug.a /home/alex/Dev/qt/qt514_built_static/qtbase/lib/libQt5Network.a -lgssapi_krb5 /home/alex/Dev/qt/qt514_built_static/qtbase/lib/libQt5PacketProtocol.a /home/alex/Dev/qt/qt514_built_static/qtbase/lib/libQt5Core.a -lm /usr/lib/x86_64-linux-gnu/libz.so /usr/lib/x86_64-linux-gnu/libdouble-conversion.so /usr/lib/x86_64-linux-gnu/libicui18n.so /usr/lib/x86_64-linux-gnu/libicuuc.so /usr/lib/x86_64-linux-gnu/libicudata.so /usr/lib/x86_64-linux-gnu/libdl.so /usr/lib/x86_64-linux-gnu/libpcre2-16.so /usr/lib/x86_64-linux-gnu/libzstd.so /usr/lib/x86_64-linux-gnu/libgthread-2.0.so /usr/lib/x86_64-linux-gnu/libglib-2.0.so -lpthread
Note that the plugin import macros are in 3 files in CMake, but in one file in qmake, that's why everything coincidentally worked.
The duplicate symbols appear because we run moc 3 times on QBearerEngineImpl in /Volumes/T3/Dev/qt/qt5_cmake/qtbase/src/plugins/bearer/qbearerengine_impl.h which generates 3 sets of symbols with the same names for each separate bearer plugin.
The proper fix would be to move qbearerengine_impl.h / QBearerEngineImpl into QtNetwork, so that moc is run only once, and the moc definitions are shared for each of the plugins.
A temporary workaround for CMake is to currently disable linkage of 2 of the 3 bearer plugins.