-
Bug
-
Resolution: Won't Do
-
P2: Important
-
None
-
6.9.2
-
Windows 10 22H2 host; pre-built Qt for WASM kit
-
-
897034bc9 (dev), d6d832d0d (dev), e7680f055 (6.10), 7e2f198f1 (tqtc/lts-6.8), 531c49d30 (6.10), 0677b635a (tqtc/lts-6.8), b2402684c (dev), 41c410f21 (6.10), 157d99a51 (tqtc/lts-6.8)
Code
CMakeLists.txt
cmake_minimum_required(VERSION 3.16) project(MyProject) find_package(Qt6 COMPONENTS Core REQUIRED) qt_add_executable(MyProject main.cpp) target_link_libraries(MyProject PRIVATE Qt6::Core) target_link_options(MyProject PRIVATE -sMAIN_MODULE=1)
main.cpp
#include <QCoreApplication> int main(int argc, char* argv[]) { QCoreApplication app(argc, argv); return app.exec(); }
Outcomes
When built in Release mode, the following command is used:
C:\emscripten-core\emsdk\upstream\emscripten\em++.bat -O3 -DNDEBUG -sMAIN_MODULE=1 -s MODULARIZE=1 -s EXPORT_NAME=MyProject_entry -s EXPORTED_RUNTIME_METHODS=UTF16ToString,stringToUTF16,JSEvents,specialHTMLTargets,FS,callMain -s INITIAL_MEMORY=50MB -s MAXIMUM_MEMORY=4GB -s MAX_WEBGL_VERSION=2 -s WASM_BIGINT=1 -s STACK_SIZE=5MB -s ALLOW_MEMORY_GROWTH -sERROR_ON_UNDEFINED_SYMBOLS=1 -sFETCH CMakeFiles/MyProject.dir/main.cpp.o -o MyProject.js C:/Qt/6.9.2/wasm_singlethread/lib/libQt6Core.a C:/Qt/6.9.2/wasm_singlethread/lib/libQt6Core.a -lembind C:/Qt/6.9.2/wasm_singlethread/lib/libQt6BundledZLIB.a C:/Qt/6.9.2/wasm_singlethread/lib/libQt6BundledPcre2.a
Notice that C:/Qt/6.9.2/wasm_singlethread/lib/libQt6Core.a appears twice.
Problems
Normally, without -sMAIN_MODULE=1, the duplication doesn't cause any problems. However, a customer wanted their Qt app to be dlopen()'ed by a larger WASM app so they added the linker flag. Unfortunately, this caused duplicated symbol errors:
wasm-ld: error: duplicate symbol: qDetectCpuFeatures >>> defined in C:/Qt/6.9.2/wasm_singlethread/lib/libQt6Core.a(qsimd.cpp.o) >>> defined in C:/Qt/6.9.2/wasm_singlethread/lib/libQt6Core.a(qsimd.cpp.o) wasm-ld: error: duplicate symbol: qt_cpu_features >>> defined in C:/Qt/6.9.2/wasm_singlethread/lib/libQt6Core.a(qsimd.cpp.o) >>> defined in C:/Qt/6.9.2/wasm_singlethread/lib/libQt6Core.a(qsimd.cpp.o) wasm-ld: error: duplicate symbol: qDumpCPUFeatures() >>> defined in C:/Qt/6.9.2/wasm_singlethread/lib/libQt6Core.a(qsimd.cpp.o) >>> defined in C:/Qt/6.9.2/wasm_singlethread/lib/libQt6Core.a(qsimd.cpp.o) ...
Workarounds
Manually run the command above with the duplicated entry removed. This causes the build to complete successfully.
Alternatively, using qmake seems to work too (QMAKE_LFLAGS += -sMAIN_MODULE=1)
- relates to
-
QTBUG-141181 What do with CMP0156 and CMake 4
-
- Closed
-
| For Gerrit Dashboard: QTBUG-140211 | ||||||
|---|---|---|---|---|---|---|
| # | Subject | Branch | Project | Status | CR | V |
| 676724,6 | CMake: Opt in for NEW CMP0156 on WebAssembly | dev | qt/qtbase | Status: MERGED | +2 | +1 |
| 677403,4 | CMake: Handle TARGET_SUPPORTS_SHARED_LIBS for Emscripten better | dev | qt/qtbase | Status: MERGED | +2 | 0 |
| 678386,2 | CMake: Handle TARGET_SUPPORTS_SHARED_LIBS for Emscripten better | 6.10 | qt/qtbase | Status: MERGED | +2 | 0 |
| 678408,2 | CMake: Opt in for NEW CMP0156 on WebAssembly | 6.10 | qt/qtbase | Status: MERGED | +2 | 0 |
| 678444,3 | CMake: Handle TARGET_SUPPORTS_SHARED_LIBS for Emscripten better | tqtc/lts-6.8 | qt/tqtc-qtbase | Status: MERGED | +2 | 0 |
| 678712,2 | CMake: Opt in for NEW CMP0156 on WebAssembly | tqtc/lts-6.8 | qt/tqtc-qtbase | Status: MERGED | +2 | 0 |
| 684520,4 | CMake: Relax handling of CMP0156 policy | dev | qt/qtbase | Status: MERGED | +2 | +1 |
| 684688,2 | CMake: Relax handling of CMP0156 policy | 6.10 | qt/qtbase | Status: MERGED | +2 | 0 |
| 684801,2 | CMake: Relax handling of CMP0156 policy | tqtc/lts-6.8 | qt/tqtc-qtbase | Status: MERGED | +2 | 0 |