首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >emscripten:在C中使用globals

emscripten:在C中使用globals
EN

Stack Overflow用户
提问于 2021-10-08 16:54:38
回答 1查看 450关注 0票数 4

我的wasm模块的C源代码必须使用全局变量,因为它使用的是服务器所共有的代码。但我明白:

代码语言:javascript
运行
复制
Uncaught (in promise) TypeError: WebAssembly.instantiate(): Import #2 module="GOT.mem" error: module is not an object or function

当我尝试使用全局。这是密码..。

daft.html

代码语言:javascript
运行
复制
<html>
 <head>
  <meta charset=utf-8 http-equiv="Content-Language" content="en"/>
  <script src="daft.js"></script>
 </head>
</html>

daft.js

代码语言:javascript
运行
复制
const heap0 = new Uint8Array(mem.buffer, 0);

function squawk(cbuf,clen) {
  var s = new Uint8Array(heap0, cbuf, clen);
  let string = '';
  for (let i = 0; i < clen; i++) {
    string += String.fromCharCode(s[i]);
  }
  console.log("Squawk: "+string);
}

var imports = {
  env: {
    'memory': mem,
    'squawk': squawk,
    '__memory_base': 0,
  }
}

async function init() {
  wa = await WebAssembly.instantiateStreaming( fetch("./daft.wasm"), imports );
  wa.instance.exports.wam();
}

init();

daft.c

代码语言:javascript
运行
复制
#include <string.h>                    
                                       
char m[] = "Hello again. ";            
                                       
extern void squawk(const char *, int); 
                                       
void wam() {                           
  char * msg = (char *) 0;             
  strcpy(msg, "Hello from C!");        
  squawk(msg, 13);                     
}                                      
                                       
//void sorgenkind() { squawk(m, 13); }       

我是这样编译的:

代码语言:javascript
运行
复制
emcc -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s WASM=1 -s SIDE_MODULE -Os -s EXPORTED_FUNCTIONS=_wam --no-entry -o daft.wasm daft.c

因此,上面的代码工作并打印“你好,从C!”在控制台上。但是,如果我取消注释sorgenkind,就会发生错误。

我曾尝试过这样的做法:

代码语言:javascript
运行
复制
var imports = {
  GOT: { mem: blah blah blah},
  ...

但我尝试过的一切都没有效果。

有趣的是,一个全局整数不会引发这个问题。似乎字符串是最小的。也许这只是因为全局int被优化了,显然,如果sorgenkind被注释掉的话,这个字符串也是如此。

我该怎么办?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-10 21:23:12

我没有安装这个软件,但似乎您必须删除-s SIDE_MODULE标志,而不是-o daft.wasm,使用-o daft.html。根据,扩展名.wasm只生成.wasm文件(就像使用-s STANDALONE_WASM时一样)。但你还需要更多。

问题是,此时WebAssembly需要JavaScript胶水代码来“使其工作”。当您使用-o draf.html时,您将得到.html.js.wasm文件(请注意不要覆盖部分文件)。在您的例子中,这是一个连接误差。查看以获得一个非常简单的示例。

简而言之,您应该只使用这个emcc daft.c -s WASM=1 -o daft.html

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69499343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档