Используя Emscripten, я пытался скомпилировать ImpulseEngine проект Рэнди Галла (C ++) в программу JavaScript. После того, как я запустил Emscripten, я последовал описанному учебнику Вот. Я выполнил все шаги: связал файлы .cpp с файлами .bc, затем скомпилировал их в файл .js.
Вот список команд, которые я выполнил:
.cpp -> .bc:
emcc ImpulseEngine-master/main.cpp -o main.bc
emcc ImpulseEngine-master/Scene.cpp -o Scene.bc
emcc ImpulseEngine-master/Render.cpp -o Render.bc
emcc ImpulseEngine-master/Precompiled.cpp -o Precompiled.bc
emcc ImpulseEngine-master/Manifold.cpp -o Manifold.bc
emcc ImpulseEngine-master/Collision.cpp -o Collision.bc
emcc ImpulseEngine-master/Clock.cpp -o Clock.bc
emcc ImpulseEngine-master/Body.cpp -o Body.bc
.bc -> .js
emcc main.bc Scene.bc Render.bc Precompiled.bc Manifold.bc Collision.bc Clock.bc Body.bc -s LEGACY_GL_EMULATION=1 -o github/khanfusiion3.github.io/index.html
Обратите внимание -s LEGACY_GL_EMULATION=1
опция: это для включения функций OpenGL. Конечно, когда я выполнил команду, я все еще получил несколько предупреждений о неразрешенных символах, как показано здесь:
warning: unresolved symbol: glPointSize
warning: unresolved symbol: glRasterPos2i
warning: unresolved symbol: glutBitmapCharacter
warning: unresolved symbol: glutBitmap9By15
Теоретически программа сейчас не удастся, независимо от того, что будет дальше, но я все равно попробовал. Он сразу же выдал ошибку и вышел. Вот список всех ошибок, зарегистрированных в консоли:
WARNING: using emscripten GL emulation. This is a collection of limited workarounds, do not expect it to work.Module.printErr @ khanfusiion3.github.io/:1249
khanfusiion3.github.io/:1249 WARNING: using emscripten GL emulation unsafe opts. If weirdness happens, try -s GL_UNSAFE_OPTS=0Module.printErr @ khanfusiion3.github.io/:1249
khanfusiion3.github.io/:1249 pre-main prep time: 12 msModule.printErr @ khanfusiion3.github.io/:1249
khanfusiion3.github.io/:1249 WARNING: using emscripten GL immediate mode emulation. This is very limited in what it supportsModule.printErr @ khanfusiion3.github.io/:1249
khanfusiion3.github.io/:1249 missing function: glRasterPos2iModule.printErr @ khanfusiion3.github.io/:1249
khanfusiion3.github.io/:1237 -1
khanfusiion3.github.io/:1249 -1Module.printErr @ khanfusiion3.github.io/:1249
khanfusiion3.github.io/:1249 warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demanglingModule.printErr @ khanfusiion3.github.io/:1249
/index.js:1879 Uncaught abort(-1) at Error
at jsStackTrace (http://khanfusiion3.github.io/index.js:1060:13)
at stackTrace (http://khanfusiion3.github.io/index.js:1077:22)
at abort (http://khanfusiion3.github.io/index.js:25065:44)
at _glRasterPos2i (http://khanfusiion3.github.io/index.js:8051:58)
at __Z12RenderStringiiPKc (http://khanfusiion3.github.io/index.js:13374:2)
at Array.__Z11PhysicsLoopv (http://khanfusiion3.github.io/index.js:9462:2)
at dynCall_v (http://khanfusiion3.github.io/index.js:24605:30)
at Object.Runtime.dynCall (http://khanfusiion3.github.io/index.js:331:39)
at http://khanfusiion3.github.io/index.js:8107:21
at Object.Browser.mainLoop.runIter (http://khanfusiion3.github.io/index.js:1873:13)
Я также попытался запустить его с -s DEMANGLE_SUPPORT=1
вариант, но другие ошибки не остановились, так что все равно не удалось.
Любая помощь о том, что вызывает ошибки и как их исправить?
ImpulseEngine использует OpenGL, который является очень сложной программой API, используемой для доступа к графическому оборудованию через специальные драйверы. Драйверы и связанный API-интерфейс недоступны в целевых объектах emscripten среды браузера; вы не собираетесь заставить его работать.
Если вы можете найти подобную библиотеку, предназначенную для SDL — широко используемую библиотеку, которая обеспечивает высокоуровневую инкапсуляцию графических API-интерфейсов, — вы можете портировать ее на emscripten, поскольку emscripten утверждает, что поддерживает SDL. В этом случае emscripten будет предоставлять низкоуровневую реализацию графических вызовов SDL, переводя их в соответствующие javascript-совместимые API.
Других решений пока нет …