Основное внимание уделяется созданию многопользовательской игры на Emscripten, SDL2, socket.io, nodejs.

Изучаем Emscripten
Компиляция простой программы описана на http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html#running-emscripten

Код простого примера использования SDL2 и emcc: https://gist.github.com/derofim/c00a8ce4c7233862ecdd

Компилировать командой emcc source.cpp -s USE_SDL=2 -s FULL_ES2=1 --preload-file res/img -o publish\emsripten\index.html -O3 -s ALLOW_MEMORY_GROWTH=1 -s USE_SDL_IMAGE=2 -s USE_SDL_TTF=2 -s SDL2_IMAGE_FORMATS="['png']"

Здесь res/img - папка с ресурсами, publish\emsripten\index.html - результат компиляции.

Cmake + Emscripten
Попробуем скомпилировать с помощью более удобного способа. Я предпочитаю cmake, им можно сгенерировать файлы для редактора ( call cmake .. -G"Visual Studio 14" ), а также готовую программу ( cmake --build . )

Скачиваем в одну папку файлы https://gist.github.com/derofim/c052308cc863fbfbb893

Наиболее интересны файлы CMakeLists.txt, emc-cmk.bat, shell.html.

emc-cmk.bat - главный скрипт, его запускаем для построения.

CMakeLists.txt используется для компиляции нужных нам файлов, при желании можно использовать другие генераторы (пример cmk.bat)

То же можно было сделать и с помощью emcc вручную (пример в build.bat) и даже используя gcc (пример gpp.bat)

Создание .lib библиотек и Emscripten
Задача - использовать библиотеку lib в проекте main.

Содержимое папки testlib: https://gist.github.com/derofim/7cfbafa452a1569d5f1f

Компилируем библиотеку получая .bc файл (флаг -I говорит о папке с заголовочными файлами):

call emcc lib.cpp -I"%folder%" -o lib.bc -O3 -Werror

Компилируем проект:

Соделржимое папки mainlib: https://gist.github.com/derofim/7fac8602b61c0c75e845

call emcc main.cpp lib.bc -I"%folder%" -I"D:\CppTests\testlib\testlib" -o index.html -O2 -Werror -s WARN_ON_UNDEFINED_SYMBOLS=1

Вызов javascript функций
Простой способ (далеко не самый лучший) - использование EM_ASM, т.е. код на javascript вставляется в C++. Из javascript функции можно вызывать с помощью cwrap. Не забываем оборачивать функции в extern "C" { ... }, добавлять EMSCRIPTEN_KEEPALIVE и использовать EXPORTED_FUNCTIONS="['_main', '_finish']"

int_sqrt = Module.cwrap('int_sqrt', 'number', ['number']);

Пример такого использования (альфа версия): https://gist.github.com/derofim/fdbce3632ea07b19f5b6

Исользование javascript библиотек и C++ (лучший выход). Используем параметр --js-library!
Можно обычный создать код на C++, без javascript вставок (что скорее всего и нужно). Результат будет в виде:

Функция extern void connectSocket(); будет взята из js файла (в примере это unicode_library.js) вида:

Компилирется такой код командой вроде call emcc main.cpp lib.bc -I"%folder%" -I"D:\CppTests\testlib\testlib" -o index.html -O2 -Werror -s WARN_ON_UNDEFINED_SYMBOLS=1 --js-library "unicode_library.js"