如何为C库编写Emscripten垫片

如何为C库编写Emscripten垫片,c,emscripten,shim,C,Emscripten,Shim,如何为C库编写自定义Emscripten垫片?Emscripten为某些C库(如SDL和OpenAL)打包,但对于其他库,您必须自己动手 我的意思是,要移植的代码所依赖的C库的JavaScript替代品。Emscripten有一些,尽管在编写时有些不完整 首先,您需要用JavaScript编写一个Emscripten“库”,假设相应的C库被称为示例: example.js: // "use strict"; var LibraryExample = { // Internal func

如何为C库编写自定义Emscripten垫片?Emscripten为某些C库(如SDL和OpenAL)打包,但对于其他库,您必须自己动手

我的意思是,要移植的代码所依赖的C库的JavaScript替代品。

Emscripten有一些,尽管在编写时有些不完整

首先,您需要用JavaScript编写一个Emscripten“库”,假设相应的C库被称为示例:

example.js:

// "use strict";

var LibraryExample = {
    // Internal functions
    $EXAMPLE: {
        internal_func: function () {
        }
    },
    example_initialize: function (arg) {
        EXAMPLE.internal_func()
    }
}

autoAddDeps(LibraryExample, '$EXAMPLE')
mergeInto(LibraryManager.library, LibraryExample)
其次,必须通过emcc的--js库选项将example.js文件集成到构建中:


现在,Emscripten生成的JS代码应该可以使用函数
example\u initialize
,从而替换C库依赖项。

如果您想用TypeScript编写JavaScript库,那么可以使用。然后,您可以将库编写为具有静态函数的类,并通过向类中添加decorator
@exportLibrary
将它们导出到asm.js代码中

依赖于其他函数的函数需要一个<代码> @ DEP>/代码>装饰器,其中的其他函数需要作为参数,否则如果Emscripten或C++中没有直接调用,则它们可能会被删除的死代码消除。 以下是npm软件包自述中的一个示例:

/// <reference path="node_modules/emscripten-library-decorator/index.ts" />

function _print(message: string) {
    console.log(message);
}

@exportLibrary
class test {
    @dep(_print)
    static hello() {
        _print('Hello, World!!');
    }

    static foobar = 42;
};
//
函数_打印(消息:字符串){
控制台日志(消息);
}
@导出库
课堂测试{
@副署长(印刷)
静态hello(){
_打印(“你好,世界!!”);
}
静态foobar=42;
};
还有一个

/// <reference path="node_modules/emscripten-library-decorator/index.ts" />

function _print(message: string) {
    console.log(message);
}

@exportLibrary
class test {
    @dep(_print)
    static hello() {
        _print('Hello, World!!');
    }

    static foobar = 42;
};