emscripten:我该如何解决 UnboundTypeError

Posted

技术标签:

【中文标题】emscripten:我该如何解决 UnboundTypeError【英文标题】:emscripten: How can I solve UnboundTypeError 【发布时间】:2013-12-03 16:01:33 【问题描述】:

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

[03:21:26.453] UnboundTypeError: 由于无法调用 intArrayToVector 未绑定类型:Pi

这是使用生成的 javascript 代码的 c++ 代码和 html 文件。

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++ --bind test.cpp -o test.js

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

【问题讨论】:

Int8Array() 创建 8 位整数? 是的,它是一个 8 位整数数组 我不知道 emscripten 如何处理它:您的默认 C++ 整数大小大于 8 位。 short int 至少为 16 位... 我尝试了 Int32Array() 和 HEAP32,但我得到了相同的结果... 【参考方案1】:

Embind doesn't support pointers to primitive types.“Pi”表示“指向整数的指针”。

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

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);
    ....

或者你可以使用the cwrap API,它支持指向原始类型的指针。

【讨论】:

以上是关于emscripten:我该如何解决 UnboundTypeError的主要内容,如果未能解决你的问题,请参考以下文章

Macvlan 上的 Pi-hole + Unbound (native. install):如何配置 Unbound 以使用 macvlan 接口?

如何跟踪 FS 被 emscripten 包含的原因?

如何使用库导入编译 C 文件到 webassembly 文件(Emscripten)

Emscripten:如何禁用警告:显式专业化不能有存储类

如何将 emscripten 与 cmake 一起用于项目依赖项?

如何表示来自 emscripten/webassembly 调用的 void* 返回