WebAssembly: экспорт пространства имен из библиотеки C ++ в JavaScript - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь перенести библиотеку lhslib (написанную на C ++) в WebAssembly с помощью emscripten (em cc v. 1.40.1, clang v. 12.0.0, macOS 10.15.5) . К сожалению, у меня очень ограниченное представление о C ++, поэтому, пожалуйста, потерпите меня. . cpp файл в WASM:

// a short overview of what the file looks like
#include "LHSCommonDefines.h"
#include "utilityLHS.h"

namespace lhslib 
{
    void randomLHS(int n, int k, bclib::matrix<int> & result, bclib::CRandom<double> & oRandom)
    {
    // further contents of the file
    }
}

Запуск

emcc ../src/lhslib/randomLHS.cpp -I../src/bclib -o randomLHS.html

создает ожидаемые файлы randomLHS.wasm, randomLHS.js и randomLHS.html. Однако при обслуживании файла html и проверке объекта Module, созданного emscripten, он не содержит желаемой функции randomLHS.

Затем я прочитал о EXPORTED_FUNCTIONS и попробовал следующее

emcc ../src/lhslib/randomLHS.cpp -I../src/bclib -o randomLHS.html -s EXPORTED_FUNCTIONS='["_randomLHS"]' -s EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]'

Это приводит к следующей ошибке:

emcc: error: undefined exported function: "_randomLHS" [-Wundefined] [-Werror]

К сожалению, я не смог найти никаких примеров, демонстрирующих, как экспортировать пространство имен (как в файл randomLHS), или как указать функцию из пространства имен, которая должна быть экспортирована. Не могли бы вы рассказать мне, как мне этого добиться?

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 20 августа 2020

Итак, согласно emscripten docs при использовании ccall и cwrap:

Эти методы можно использовать с скомпилированными C функциями - C ++ с измененным именем функции не будут работать.

Я считаю, что есть другие способы сделать это; Проверить WebIDL Binder и Embind .

...