我正在尝试使用 emscripten 编译一个中等大小的现有代码库。目前一切都已编译,但是当我尝试从 javascript 调用它时,我收到错误:
Assertion failed: Cannot call unknown function InitHOG (perhaps LLVM optimizations or closure removed it?)
我已将其声明为:
extern "C" {
void EMSCRIPTEN_KEEPALIVE InitHOG()
{ ... }
}
我将 javascript 中的函数链接到:
InitHog = Module.cwrap('InitHOG', 'void', []);
我的代码库正在被编译成库;对库的函数调用位于我的 guihtml 库中,最终的链接命令是:
emcc -o ../../../../html/debug/bidirnecessary.js ../../../../objs_html/bidirnecessary.js/debug/demos/bidirnecessary/Driver.o -lenvironments -lmapalgorithms -lalgorithms -lgraphalgorithms -lgraph -lutils -lguihtml -L../../../../html/debug -Lapps/libs -Ldemos/libs -lpthread -g
关于为什么它无法从 javascript 找到我的函数有什么想法吗?
请您参考如下方法:
虽然 EMSCRIPTEN_KEEPALIVE
关键字在将单个文件编译为 .js 输出时有效,但它在我编译单个文件的 makefile 系统中不起作用,请使用emar
创建一个库,然后最后将所有内容链接在一起。
相反,您需要使用 -s
指令来指定要导出的函数。所以,像这样的东西是有效的。
emcc -o ../../../../html/debug/bidirnecessary.js ../../../../objs_html/bidirnecessary.js/debug/demos/bidirnecessary/Driver.o -lenvironments -lmapalgorithms -lalgorithms -lgraphalgorithms -lgraph -lutils -lguihtml -lgui -L../../../../html/debug -Lapps/libs -Ldemos/libs -lpthread -g -s EXPORTED_FUNCTIONS="['_InitHOG', '_DoFrame', '_MouseEvent']"