我应该在JS中定义emscripten extern函数在哪里?

时间:2015-11-12 14:18:39

标签: javascript emscripten asm.js

假设我在C ++中有函数x定义为:

extern "C" void x();

我在全球范围内的JS中实现它

function _x() { console.log('x called'); }

_x在asm编译的js文件中定义,该文件被调用而不是我的实现。我做错了什么?

我在链接时收到此警告:

warning: unresolved symbol: x

这是stacktrace:

Uncaught abort() at Error
at jsStackTrace (http://localhost/module.js:978:13)
at stackTrace (http://localhost/module.js:995:22)
at abort (http://localhost/module.js:71106:25)
at _x (http://localhost/module.js:5829:46)
at Array._x__wrapper (http://localhost/module.js:68595:41)
at Object.dynCall_vi (http://localhost/module.js:68442:36)
at invoke_vi (http://localhost/module.js:7017:25)
at _LoadFile (http://localhost/module.js:7573:6)
at asm._LoadFile (http://localhost/module.js:69219:25)
at eval (eval at cwrap (http://localhost/module.js:554:17), <anonymous>:6:26)

2 个答案:

答案 0 :(得分:1)

Implement a C API in Javascript所述,您可以通过调用mergeInto的Javascript文件来定义库,以将对象与您的Javascript函数合并到LibraryManager.library。然后使用--js-library选项进行编译以传入库的位置。

例如,您可以将Javascript文件与您的单个函数库一起使用

// In library.js
mergeInto(LibraryManager.library, {
  x: function() {
    alert('hi');
  },
});

调用此函数的主C ++文件

// in librarytest.cc
extern "C" void x();

int main()
{
  x();
  return 0;
}

并使用

编译为HTML和Javascript
em++ librarytest.cc --js-library library.js -o librarytest.html

然后您在浏览器中加载librarytest.html,它会显示一个包含hi的提醒框。

答案 1 :(得分:0)

如果你想将一个字符串从C ++传递给Javascript,你就不必走Implement a C API in Javascript的路线了。相反,您可以使用EM_ASM* macros直接内联Javascript。然后,这可以调出您已定义的Javascript函数,并传递它们的值。

另外,要传递字符串,您需要确保传递C样式字符串,然后在结果上使用Emscripten提供的Pointer_stringify Javascript函数:

#include <string>

#include <emscripten.h>

int main()
{
  std::string myString("This is a string in C++");

  EM_ASM_ARGS({
    console.log(Pointer_stringify($0));
  }, myString.c_str());

  return 0;
}