如何为C库编写Emscripten垫片
如何为C库编写自定义Emscripten垫片?Emscripten为某些C库(如SDL和OpenAL)打包,但对于其他库,您必须自己动手 我的意思是,要移植的代码所依赖的C库的JavaScript替代品。Emscripten有一些,尽管在编写时有些不完整 首先,您需要用JavaScript编写一个Emscripten“库”,假设相应的C库被称为示例: example.js:如何为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
// "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;
};