emscripten-core / emscripten-core/emscripten

Emscripten and GLFW: can't compile due to linking error

Open
#20,446 5 comments 0 reactions 0 assignees View on GitHub
GLFW help wanted
Dominant language
C++
Stars
27.6k
Forks
3.6k
Avg merge
1d 1h
Merged PRs (30d)
105

Description

I need help understanding how I would use emscripten with glfw. My first initial problem was the cmake configure command complain about this:
```
CMake Error at /home/mrmav/cmake/cmake-3.27.7-linux-x86_64/share/cmake-3.27/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
Could NOT find X11 (missing: X11_X11_LIB)
Call Stack (most recent call first):
/home/mrmav/cmake/cmake-3.27.7-linux-x86_64/share/cmake-3.27/Modules/FindPackageHandleStandardArgs.cmake:600 (_FPHSA_FAILURE_MESSAGE)
/home/mrmav/cmake/cmake-3.27.7-linux-x86_64/share/cmake-3.27/Modules/FindX11.cmake:665 (find_package_handle_standard_args)
engine/external/glfw/CMakeLists.txt:206 (find_package)
```
After hours trying to fix this issue, I found someone stating that when building with emscripten, one doesn't need to add the glfw library?
So I added a guard to my cmakelists:
```
# if(NOT EMSCRIPTEN)
# not adding glfw, since emscripten includes it??
add_subdirectory(external/glfw)
# endif()
```
I still linked like so: `target_link_libraries(${PROJECT_NAME} glfw ${GLFW_LIBRARIES} imgui)`
I also added the following:
```
# https://thatonegamedev.com/cpp/programming-a-c-game-for-the-web-emscripten/
if (EMSCRIPTEN)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s USE_GLFW=3 -s ASSERTIONS=1 -s WASM=1 -s ASYNCIFY -sMAX_WEBGL_VERSION=2")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s USE_GLFW=3 -s ASSERTIONS=1 -s WASM=1 -s ASYNCIFY -sMAX_WEBGL_VERSION=2")
set(CMAKE_EXECUTABLE_SUFFIX ".html")
endif ()
```
Now I'm getting linking errors, stating that glfw symbols are not found.
Can anybody point me in the right direction on how to use emscripten and glfw?
Thank you!

**Version of emscripten/emsdk:**
```
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.47 (431685f05c67f0424c11473cc16798b9587bb536)
clang version 18.0.0 (https://github.com/llvm/llvm-project 21030b9ab4487d845e29792063f5666d8c4b8e09)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /home/mrmav/repos/emsdk/upstream/bin
```

**Failing command line in full:**
```
[ 35%] Linking CXX executable self-gamejam.js
cache:INFO: generating system asset: symbol_lists/026fad9af443ccf46b78e2f965a6e355dbcc75ff.json... (this will be cached in "/home/mrmav/repos/emsdk/upstream/emscripten/cache/symbol_lists/026fad9af443ccf46b78e2f965a6e355dbcc75ff.json" for subsequent builds)
cache:INFO: - ok
wasm-ld: error: CMakeFiles/self-gamejam.dir/engine/src/Input/Input.cpp.o: undefined symbol: glfwUpdateGamepadMappings
wasm-ld: error: CMakeFiles/self-gamejam.dir/engine/src/Input/Input.cpp.o: undefined symbol: glfwGetGamepadState
em++: error: '/home/mrmav/repos/emsdk/upstream/bin/wasm-ld -o self-gamejam.wasm CMakeFiles/self-gamejam.dir/src/MapLoader.cpp.o CMakeFiles/self-gamejam.dir/src/SkiGame.cpp.o CMakeFiles/self-gamejam.dir/src/Sprite.cpp.o CMakeFiles/self-gamejam.dir/src/main.cpp.o CMakeFiles/self-gamejam.dir/src/Player.cpp.o CMakeFiles/self-gamejam.dir/src/InputCursor.cpp.o CMakeFiles/self-gamejam.dir/src/GameCamera.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Game.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Timer.cpp.o CMakeFiles/self-gamejam.dir/engine/src/OpenGL/ShaderAttributes.cpp.o CMakeFiles/self-gamejam.dir/engine/src/OpenGL/Texture2D.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Render/Camera2D.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Render/Spritebatch.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Render/BitmapFont.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Input/Input.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Utils/Utils.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Utils/Rectangle.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Systems/FrameAnimation.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Systems/TileSet.cpp.o CMakeFiles/self-gamejam.dir/engine/external/glad/glad.c.o CMakeFiles/self-gamejam.dir/engine/external/imgui/backends/imgui_impl_glfw.cpp.o CMakeFiles/self-gamejam.dir/engine/external/imgui/backends/imgui_impl_opengl3.cpp.o engine/libsimple-cpp-engine.a engine/external/libimgui.a -L/home/mrmav/repos/emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten -lGL-webgl2 -lal -lhtml5 -lstubs-debug -lnoexit -lc-debug -ldlmalloc -lcompiler_rt -lc++-noexcept -lc++abi-debug-noexcept -lsockets -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr /tmp/tmpmwn1j5emlibemscripten_js_symbols.so --export-if-defined=main --export-if-defined=__start_em_asm --export-if-defined=__stop_em_asm --export-if-defined=__start_em_lib_deps --export-if-defined=__stop_em_lib_deps --export-if-defined=__start_em_js --export-if-defined=__stop_em_js --export-if-defined=__main_argc_argv --export-if-defined=fflush --export=emscripten_stack_get_end --export=emscripten_stack_get_free --export=emscripten_stack_get_base --export=emscripten_stack_get_current --export=emscripten_stack_init --export=stackSave --export=stackRestore --export=stackAlloc --export=__errno_location --export=__get_temp_ret --export=__set_temp_ret --export=malloc --export=free --export=__wasm_call_ctors --export-table -z stack-size=65536 --initial-memory=16777216 --max-memory=16777216 --no-entry --stack-first --table-base=1' failed (returned 1)
gmake[2]: *** [CMakeFiles/self-gamejam.dir/build.make:459: self-gamejam.js] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:383: CMakeFiles/self-gamejam.dir/all] Error 2
gmake: *** [Makefile:136: all] Error 2
```

**Full link command and output with `-v` appended:**
```
[ 18%] Linking CXX executable self-gamejam.js
/home/mrmav/cmake/cmake-3.27.7-linux-x86_64/bin/cmake -E cmake_link_script CMakeFiles/self-gamejam.dir/link.txt --verbose=1
/home/mrmav/repos/emsdk/upstream/emscripten/em++ -s USE_GLFW=3 -s ASSERTIONS=1 -s WASM=1 -s ASYNCIFY -sMAX_WEBGL_VERSION=2 @CMakeFiles/self-gamejam.dir/objects1.rsp -o self-gamejam.js @CMakeFiles/self-gamejam.dir/linkLibs.rsp
wasm-ld: error: CMakeFiles/self-gamejam.dir/engine/src/Input/Input.cpp.o: undefined symbol: glfwUpdateGamepadMappings
wasm-ld: error: CMakeFiles/self-gamejam.dir/engine/src/Input/Input.cpp.o: undefined symbol: glfwGetGamepadState
em++: error: '/home/mrmav/repos/emsdk/upstream/bin/wasm-ld -o self-gamejam.wasm CMakeFiles/self-gamejam.dir/src/MapLoader.cpp.o CMakeFiles/self-gamejam.dir/src/SkiGame.cpp.o CMakeFiles/self-gamejam.dir/src/Sprite.cpp.o CMakeFiles/self-gamejam.dir/src/main.cpp.o CMakeFiles/self-gamejam.dir/src/Player.cpp.o CMakeFiles/self-gamejam.dir/src/InputCursor.cpp.o CMakeFiles/self-gamejam.dir/src/GameCamera.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Game.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Timer.cpp.o CMakeFiles/self-gamejam.dir/engine/src/OpenGL/ShaderAttributes.cpp.o CMakeFiles/self-gamejam.dir/engine/src/OpenGL/Texture2D.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Render/Camera2D.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Render/Spritebatch.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Render/BitmapFont.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Input/Input.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Utils/Utils.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Utils/Rectangle.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Systems/FrameAnimation.cpp.o CMakeFiles/self-gamejam.dir/engine/src/Systems/TileSet.cpp.o CMakeFiles/self-gamejam.dir/engine/external/glad/glad.c.o CMakeFiles/self-gamejam.dir/engine/external/imgui/backends/imgui_impl_glfw.cpp.o CMakeFiles/self-gamejam.dir/engine/external/imgui/backends/imgui_impl_opengl3.cpp.o engine/libsimple-cpp-engine.a engine/external/libimgui.a -L/home/mrmav/repos/emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten -lGL-webgl2 -lal -lhtml5 -lstubs-debug -lnoexit -lc-debug -ldlmalloc -lcompiler_rt -lc++-noexcept -lc++abi-debug-noexcept -lsockets -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr /tmp/tmpp28bmczalibemscripten_js_symbols.so --export-if-defined=main --export-if-defined=__start_em_asm --export-if-defined=__stop_em_asm --export-if-defined=__start_em_lib_deps --export-if-defined=__stop_em_lib_deps --export-if-defined=__start_em_js --export-if-defined=__stop_em_js --export-if-defined=__main_argc_argv --export-if-defined=fflush --export=emscripten_stack_get_end --export=emscripten_stack_get_free --export=emscripten_stack_get_base --export=emscripten_stack_get_current --export=emscripten_stack_init --export=stackSave --export=stackRestore --export=stackAlloc --export=__errno_location --export=__get_temp_ret --export=__set_temp_ret --export=malloc --export=free --export=__wasm_call_ctors --export-table -z stack-size=65536 --initial-memory=16777216 --max-memory=16777216 --no-entry --stack-first --table-base=1' failed (returned 1)
gmake[2]: *** [CMakeFiles/self-gamejam.dir/build.make:459: self-gamejam.js] Error 1
gmake[2]: Leaving directory '/home/mrmav/repos/self-gamejam/build'
gmake[1]: *** [CMakeFiles/Makefile2:383: CMakeFiles/self-gamejam.dir/all] Error 2
gmake[1]: Leaving directory '/home/mrmav/repos/self-gamejam/build'
gmake: *** [Makefile:136: all] Error 2
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.