8.22.2019

Как скомпилить C&C++ код в Web Assembly на Windows 10 / Вектор поиска

Вектор поиска - это небольшая заметка дающая правильный вектор для того или иного вопроса на основе опыта автора.

Быстрый ответ используйте docker контейнер, но нужно иметь windows pro и устранить несколько багов из статьи. Каких именно и как читайте ниже :) 

Ах да и прочтение статьи все еще не позволит вам компилить код с подключенной библиотекой, например какие-то либы. Конечно если вы не разбираетесь в тех ошибках которые будут выскакивать при компиляции.

Если вы хотите запустить С/С++ код в браузере либо в node.js то можно использовать Web Assembly.

WA - это такой формат байт кода который понимает браузер. Берешь байт код (его можно загрузить так же как загружаются картинки), пихаешь его в массив байтов как-то так new Uint8Array дальше компилишь в модуль WebAssembly.compile(new Uint8Array) и из полученного модуля создаешь экземпляр класса в котором и будут доступны функции из C/C++ программы new WebAssembly.Instance(WebAssembly.compile(new Uint8Array)).

В общем почитайте тут. В статье используется онлайн компилер.

Возможные варианты компиляции


Для компиляции кода C/C++ в web assembly байт код существует аналог gpp. Называется Emscripten. И тут есть три варианта как его использовать:
  1. Установить на Windows и попробовать избежать ошибок :)
  2. Установить на Linux используя Virtual Box.
  3. Рабочий. О нем чуть ниже.
Установка на Windows конечно вариант не плохой, но всегда найдется ситуация когда возникнет ошибка и ответы будут под linux.

Установка на linux идеальный вариант, но лично мне не нравится вариант с Virtual Box потому что он не удобный. Для меня этот подход оказался очень медленным в разработке.

И тут на помощь приходит третий вариант который я счел оптимальным.

3. Docker контейнер.


Понадобится контейнер в котором уже все настроено /https://hub.docker.com/r/trzeci/emscripten/
Взять за основу статью Emscripten and npm. А так же устранить пару ошибок.

Ошибка с путями


На винде может возникнуть ошибка с монтированием директории из-за путей. Помогает использование полного пути. Например так вместо $(pwd)
docker run --rm -v d:/_projects/web-assembly:/src trzeci/emscripten./build.sh
В статье так
docker run --rm -v $(pwd):/src trzeci/emscripten./build.sh 

Ошибка при чтении build.sh из-за текстовой кодировки


Для устанения символов понадобится програмка doc2unix.

Ошибка с путем к директории src


src/my-module.cpp из build.sh заменяем на my-module.cpp

Ошибка с командой npm run build:app

 

У меня скрипт "build:app": "cp index.html dist/index.html", просто не запустился. Оно и понятно так как cp не указан как зависимость.

Я предпочел использовать copyfiles npm i copyfiles --save-dev.

А в секции команды build:app написать так "build:app": "copyfiles index.html dist/