Building to WebAssembly: redefinition of '__glewCreateProgram' as different kind of symbol
-
EDIT: Apologies, looks like this is the wrong section for this post. I've made a copy of it in the right place.
Hello All!
So I'm trying to build this project (which I originally build for Mac, works perfectly) to WebAssembly.OS: 10.15.6 (Catalina)
XCode Version: 11.7I'm new to Qt, but I've been trying to do some digging to get this to work (been trying for a few days)
I'm going to be updating this as I work through the problem, and I'll keep all the details of how I fixed previous problems for reference and to answer questions you might have.
Hence, there are two sections: the "MY CURRENT PROBLEM" section with my current roadblock, and the HOW I GOT HERE (for the past stuff, look at that if you like).
PS: If you could also just build the repo for me in web assembly and send me the export files; that be great 😂. This is turning out to be a huge headache due to my inexperience.
------------------------------------------------------------------------------------------
----------MY CURRENT PROBLEM----------
------------------------------------------------------------------------------------------
I currently have two worries. The number 1 priority is that I can't build because of these errors:/Users/andersonaddo/emsdk/upstream/emscripten/system/include/GLES3/gl3.h:553: error: redefinition of '__glewCreateProgram' as different kind of symbol In file included from ../cs1230-final/ui/mainwindow.cpp:5: In file included from ../Qt/5.15.2/wasm_32/include/QtOpenGL/qgl.h:45: In file included from ../Qt/5.15.2/wasm_32/include/QtGui/qopengl.h:109: /Users/andersonaddo/emsdk/upstream/emscripten/system/include/GLES3/gl3.h:553:31: error: redefinition of '__glewCreateProgram' as different kind of symbol GL_APICALL GLuint GL_APIENTRY glCreateProgram (void); ^ ../cs1230-final/glew-1.10.0/include/GL/glew.h:1897:38: note: expanded from macro 'glCreateProgram' #define glCreateProgram GLEW_GET_FUN(__glewCreateProgram) ^ ../cs1230-final/glew-1.10.0/include/GL/glew.h:15167:40: note: previous definition is here GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram; ^ fatal error: too many errors emitted, stopping now [-ferror-limit=]
I've looked into this a bit, and it says here that building Qt from source might be a solution? I dunno though; I'm thinking there should be a simpler and less error-prone solution to this. Any ideas?
Additionally, I'm getting a lot of these types of warnings:
/Users/andersonaddo/Qt/5.15.2/wasm_32/include/QtCore/qglobal.h:1253: warning: variable templates are incompatible with C++ standards before C++14 [-Wc++98-c++11-compat] ../Qt/5.15.2/wasm_32/include/QtCore/qglobal.h:1253:82: warning: variable templates are incompatible with C++ standards before C++14 [-Wc++98-c++11-compat] template <typename... Args> Q_CONSTEXPR Q_DECL_UNUSED QNonConstOverload<Args...> qNonConstOverload = {}; ^
Is this something I should worry about?
------------------------------------------------------------------------------------------
----------HOW I GOT HERE----------
------------------------------------------------------------------------------------------
I originally tried to follow these instructions to build from source (during which I had to do a few changes on the emsdk to get Qt to recognize it), and ran into a bunch of these types of errors::-1: warning: ignoring file /Users/andersonaddo/Qt/5.15.2/wasm_32/lib/libqtharfbuzz.a, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x21 0x3C 0x61 0x72 0x63 0x68 0x3E 0x0A 0x2F 0x20 0x20 0x20 0x20 0x20 0x20 0x20 )
I gave up after that route and tried to do this without building from source because I thought maybe I had done something wrong with building.
So I used the Qt Online Installer, and the maintenance tool that came with it to redownload Qt Creator 4.13.3 and the Qt 5.15.2 WebAssembly Kit.
At this point I do have the correct emscripten verions activated, I believe:
Andersons-MBP:emsdk andersonaddo$ ./emsdk activate 1.39.8 Setting the following tools as active: node-12.18.1-64bit python-3.7.4-2-64bit releases-upstream-9e60f34accb4627d7358223862a7e74291886ab6-64bit Next steps: - To conveniently access emsdk tools from the command line, consider adding the following directories to your PATH: /Users/andersonaddo/emsdk /Users/andersonaddo/emsdk/node/12.18.1_64bit/bin /Users/andersonaddo/emsdk/python/3.7.4-2_64bit/bin /Users/andersonaddo/emsdk/upstream/emscripten - This can be done for the current shell by running: source "/Users/andersonaddo/emsdk/emsdk_env.sh" - Configure emsdk in your bash profile by running: echo 'source "/Users/andersonaddo/emsdk/emsdk_env.sh"' >> $HOME/.bash_profile
My Kit now Looks like this:
The compilers are the automatically detected ones.At this point I started getting these errors (before running):
Project WARNING: This Qt was built with Emscripten version 1.39.8. You have . The difference may cause issues.
warning: "/Users/andersonaddo/emsdk/fastcomp/emscripten/emcc" is used by qmake, but "Users/andersonaddo/emsdk/fastcomp/fastcomp/bin/clang" is configured in the kit. Please update your kit (Qt 5.15.2 WebAssembly) or choose a mkspec for qmake that matches your target environment better.
warning: "/Users/andersonaddo/emsdk/fastcomp/emscripten/em++" is used by qmake, but "Users/andersonaddo/emsdk/fastcomp/fastcomp/bin/clang" is configured in the kit. Please update your kit (Qt 5.15.2 WebAssembly) or choose a mkspec for qmake that matches your target environment better.
And when I try to run it regardless then I get these errors:
:-1: warning: em++: No such file or directory
:-1: error: [final.js_plugin_import.o] Error 1
So I decided maybe I should change the compilers to point to emsdk files that point to files with the names em++ and emcc.
So I used these compilers (manually added)
But then I get these types of errors:
Compiler feature detection failure! The command "/Users/andersonaddo/emsdk/fastcomp/emscripten/em++ -print-search-dirs" terminated with exit code 1. shared:ERROR: no input files note that input files without a known suffix are ignored, make sure your input files end with one of: ('.c', '.C', '.i', '.cpp', '.cxx', '.cc', '.c++', '.CPP', '.CXX', '.CC', '.C++', '.ii', '.m', '.mi', '.mm', '.mii', '/dev/null', '.bc', '.o', '.obj', '.lo', '.dylib', '.so', '.a', '.ll', '.h', '.hxx', '.hpp', '.hh', '.H', '.HXX', '.HPP', '.HH')
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" is used by qmake, but "/Users/andersonaddo/emsdk/fastcomp/emscripten/emcc" is configured in the kit. Please update your kit (Qt 5.15.2 WebAssembly) or choose a mkspec for qmake that matches your target environment better.
And at the end of the day, I get still end up right where I started, with these errors:
:-1: warning: ignoring file /Users/andersonaddo/Qt/5.15.2/wasm_32/plugins/imageformats/libqico.a, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x21 0x3C 0x61 0x72 0x63 0x68 0x3E 0x0A 0x2F 0x20 0x20 0x20 0x20 0x20 0x20 0x20 )
Which understandably, cause Undefined symbol errors and linker errors.
So I looked into the "ignoring file" error more, but all I found is this. Apparently they say it might be a Xcode bug or something? I didn't quite understand their fix though - they say it can be helpful to force the target macos version. I tried doing it in this portion of my projects .pro file:
macx { QMAKE_CFLAGS_X86_64 += -mmacosx-version-min=10.14 <------changed from 10.7 QMAKE_CXXFLAGS_X86_64 = $$QMAKE_CFLAGS_X86_64 CONFIG += c++11 }
but no luck.
Along the way, during this process, these files were added to my project:
final.js_plugin_import.cpp
final_plugin_import.cpp
They both look like:// This file is autogenerated by qmake. It imports static plugin classes for // static plugins specified using QTPLUGIN and QT_PLUGIN_CLASS.<plugin> variables. #include <QtPlugin> Q_IMPORT_PLUGIN(QWasmIntegrationPlugin) Q_IMPORT_PLUGIN(QGifPlugin) Q_IMPORT_PLUGIN(QICNSPlugin) Q_IMPORT_PLUGIN(QICOPlugin) Q_IMPORT_PLUGIN(QJpegPlugin) Q_IMPORT_PLUGIN(QTgaPlugin) Q_IMPORT_PLUGIN(QTiffPlugin) Q_IMPORT_PLUGIN(QWbmpPlugin) Q_IMPORT_PLUGIN(QWebpPlugin)
So I decided to look at things and tinker a bit more. I found out that I had made a mistake with my copy of the .emscripten file (things were pointing to the wrong places), so I corrected it to look like:
import os emsdk_path = os.path.dirname(os.environ.get('EM_CONFIG')).replace('\\', '/') NODE_JS = '/Users/andersonaddo/emsdk/node/12.18.1_64bit/bin/node' PYTHON = '/Users/andersonaddo/emsdk/python/3.7.4-2_64bit/bin/python3' LLVM_ROOT = '/Users/andersonaddo/emsdk/upstream/bin' BINARYEN_ROOT = '/Users/andersonaddo/emsdk/upstream' EMSCRIPTEN_ROOT = '/Users/andersonaddo/emsdk/upstream/emscripten' TEMP_DIR = '/Users/andersonaddo/emsdk/tmp' COMPILER_ENGINE = NODE_JS JS_ENGINES = [NODE_JS] EMCC_DEBUG=1
And I also changed my manually added compilers to:
I then tried to build, and it seemed like it was working! But then... [look at WHERE I AM section now]