emscripten:如何解决UnboundTypeError

emscripten: How can I solve UnboundTypeError

本文关键字:解决 UnboundTypeError 何解决 emscripten      更新时间:2023-10-16

我正在尝试使用emscripten构建一个使用std::vector和std::map的程序,并且编译成功。然而,当我在web浏览器(firefox/cochrome)上运行它时,UnboundTypeError被捕获。

[03:21:26.453]UnboundTypeError:由于未绑定类型:Pi

这里是c++代码和HTML文件,它使用生成的javascript代码。

test.cpp:

#include <vector>
#include <emscripten/bind.h>
using namespace emscripten;
std::vector<int> intArrayToVector(int* input, int num){
    std::vector<int> vec;
    for(int i=0; i<num; i++){
        int val = *(input+i);
        vec.push_back(val);
    }
    return vec;
}
EMSCRIPTEN_BINDINGS(test){
    register_vector<int>("VectorInt");
    function("intArrayToVector", &intArrayToVector, allow_raw_pointer<arg<0>>());
}

test.html:

<html>
<body>
<script src="test.js"></script>
<script>
    var num = 6;
    var buf = Module._malloc(100);
    var arr = new Int8Array(num);
    for(var i=0; i<num; i++){
        arr[i] = i+2;
    }
    Module.HEAP8.set(arr, buf);
    var v = Module.intArrayToVector(buf, num);
    for(var i=0; i<num; i++){
        console.log(v.get(i));
    }
    Module._free(buf);
</script>
</body>
</html>

javascript代码由以下命令生成:

$em++--绑定test.cpp-o test.js

我该如何解决这个问题?谢谢你的帮助!

Embind不支持指向基元类型的指针。"Pi"表示"指向整数的指针"。

如果您总是提前知道数组的大小,那么可以尝试将数组作为常量引用传递。例如

std::vector<int> intArrayToVector(const int (&input)[100])

或者,您可以欺骗并使用整数参数作为指针,并使用reinterpret_cast将其视为指针。例如

std::vector<int> intArrayToVector(uintptr_t input, size_t len) {
    const int* ptr = reinterpret_cast<int*>(input);
    ....
}

或者您可以使用cwrap API,它支持指向基元类型的指针。