假设我在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)
答案 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和Javascriptem++ 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;
}