我被困住了,我希望有人可以提供帮助,\n我正在尝试为 webasm 构建 h264lib_opencore 库,并且成功构建了它,我从这个庞大的库及其依赖项中分离出了我需要的功能,并构建了一个 .a通过 emmake make 或在 CLion 中设置工具链,它可以从 emscripten 工具链成功构建静态库 .a。
\n但是,我不\xe2\x80\x99t 认为函数已正确导出,因此我使用了该-s EXPORTED_FUNCTIONS命令,但不幸的是,即使我已经在我EMSCRIPTEN_KEEPALIVE尝试调用的函数中添加了 a ,但我还是得到了未定义的导出函数。\n并且该函数可以也可以在生成的 .a 文件中看到(通过十六进制编辑器)。\n但是当我执行emcc(或em++)操作时-s EXPORTED_FUNCTIONS,我收到错误 \xe2\x80\x9cundefined 导出函数\xe2\x80\x9d
我在这里还缺少什么?
\n我使用的命令:
\nem++ libH264lib_opencore.a -o H264lib_opencore.js -s EXPORTED_FUNCTIONS="['_h264_decoder_process_first_frame']"\nRun Code Online (Sandbox Code Playgroud)\n错误
\nem++: error: undefined exported function: "_h264_decoder_process_first_frame" [-Wundefined] [-Werror]\nRun Code Online (Sandbox Code Playgroud)\n如果我打开生成的 .a 库的十六进制编辑器,我可以看到该函数就在那里,尽管名称类似于
\n_ZN16h264lib_opencore32h264_decoder_process_first_frameEPvS0_iS0_iPiS1_i\nRun Code Online (Sandbox Code Playgroud)\n我 int EMSCRIPTEN_KEEPALIVE h264_decoder_process_first_frame()还在编译之前在源中添加了
我在这里缺少什么?
\nemcc如果我使用without编译我的 C++ 代码-s MODULARIZE=1 -s 'EXPORT_NAME="createMyModule"',我可以加载我的 WebAssembly 并访问文件系统 API,如下所示:
HTML:
<script type="text/javascript">
var Module = {
onRuntimeInitialized: function() {
console.log('Module loaded!');
if (FS.mkdir) {
console.log('File System API available!');
}
}
};
</script>
<script type="text/javascript" src="myWebAssemblyModule.js"></script>
<script type="module" src="my.js"></script>
Run Code Online (Sandbox Code Playgroud)
日志:
Module loaded!
File System API available!
Run Code Online (Sandbox Code Playgroud)
但是,如果我添加-s MODULARIZE=1 -s 'EXPORT_NAME="createMyModule"'编译器选项,并尝试基于 Promise 访问文件系统 API,则它不起作用:
HTML:
<script type="text/javascript" src="myWebAssemblyModule.js"></script>
<script type="module" src="my.js"></script>
Run Code Online (Sandbox Code Playgroud)
我的.js:
createMyModule().then(MyModule => {
console.log('Module loaded!');
if (MyModule.FS.mkdir) {
console.log('File System API available!');
} …Run Code Online (Sandbox Code Playgroud) 寻找调整来自 Emscripten 的 SDL2 窗口/画布大小的正确方法。目前,我在 JS“resize”事件上添加一个事件侦听器,并将 Canvas 父级的客户端宽度 + 高度发送到 Emscripten,然后更新在每次渲染时调用的宽度和高度变量。
这会产生奇怪的结果 - 比例始终关闭,实际可用的 SDL2 区域没有更改,并且指针事件不再与 SDL 对齐。
我的窗口大小变量是:
int canvasWidth = 800;
int canvasHeight = 600;
Run Code Online (Sandbox Code Playgroud)
这是我的初始化代码:
void Init()
{
int i;
for (i = 0; i < 256; i++)
gPressed[i] = gWasPressed[i] = 0;
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE) < 0)
{
fprintf(stderr, "Video initialization failed: %s\n", SDL_GetError());
SDL_Quit();
exit(0);
}
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
int flags = SDL_WINDOW_OPENGL | …Run Code Online (Sandbox Code Playgroud) (1) 我听说 WebAssembly 通过提供线性内存而安全。我想知道这个线性存储器包含什么?wasm栈和堆是否位于这个内存空间?如果是的话,我认为 wasm 堆栈和粘合代码堆栈(例如 JavaScript、Python 等)是分开的,对吧?
(2)我可以通过使用导入表来了解wasm的内存安全性。换句话说,wasm函数不能调用线性内存之外的任何函数,因为它只能使用索引来调用导入的函数。除此之外,wasm 还提供哪些其他安全功能?可能是上面的堆栈问题。
(3) 看起来wasm中也有控制流完整性。也就是说每个函数的返回地址都是固定的,不能在函数内部修改。这是正确的理解吗?
我正在尝试编写一个 Web 应用程序,它将使用后端 C/C++ 代码进行某种文字处理(例如拼写检查、语法检查、文字分析)。(我有 C/C++ 代码在另一个桌面应用程序中工作......我想将它带到网络上)。我想要一个示例最小代码来执行此操作(将字符串数组从 JavaScript 传递到 c/c++ 代码...c/c++ 代码将执行单词操作...我有这段代码......以及生成的数组字符串将被发送回 JavaScript,在那里它们将被进一步处理。(传入和传出数组很重要)请向我指出任何此类代码/教程,我可以从那里开始。
我搜索了 GitHub。我发现了几个使用 emscripten 的项目,但无法在任何地方找到它。(我唯一能得到一些线索的地方是 Hunspell 用 emscripten 构建......但是我无法成功构建它)
请告诉我 。提前致谢。
我正在尝试使用一些 ES 3.1 功能,目前尚不清楚是否支持:
我注意到 emscripten 存储库中有一个 OpenGL ES 3.1 标头,它定义了我正在寻找的一些函数,我可以将它们成功地包含在我的项目中。但是,当我尝试链接时它们不可用:
error: undefined symbol: glDispatchCompute (referenced by top-level compiled C/C++ code)
warning: _glDispatchCompute may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library
Run Code Online (Sandbox Code Playgroud)
文档说,如果我指定(我正在这样做),则支持 OpenGL ES3 。-s FULL_ES3=1
既然有它的标题,那么这个功能可用吗?如果是这样,我如何启用对其的支持?(例如,是否需要手动加载扩展或在 emscripten 中启用实验支持?)
有一个函数在R被调用pf,源是在这里.
我正在尝试使用emscripten将此函数转换为JavaScript.我这样调用:
emcc -s EXPORTED_FUNCTIONS="['pf']" nmath/pf.c \
-Ignuwin32/fixed/h/ \
-I/usr/local/Cellar/r/3.1.1/include/ \
-I/usr/local/Cellar/r/3.1.1/R.framework/Versions/3.1/Resources/include/
Run Code Online (Sandbox Code Playgroud)
我收到警告:
WARNING root: function requested to be exported, but not implemented: "pf"
Run Code Online (Sandbox Code Playgroud)
并且,pf在输出js中没有任何暗示.根据emcc,为什么这个功能"没有实现"?
编辑(根据zakki的答案它应该是_pf,-s EXPORTED_FUNCTIONS="['_pf']"但问题仍然存在):
有关绝对包含路径的事先警告.但是,我假设它可以被忽略?也许它至关重要:
emcc -s EXPORTED_FUNCTIONS="['_pf']" nmath/pf.c -Ignuwin32/fixed/h/ -I/usr/local/Cellar/r/3.1.1/include/ -I/usr/local/Cellar/r/3.1.1/R.framework/Versions/3.1/Resources/include/
WARNING root: -I or -L of an absolute path "-I/usr/local/Cellar/r/3.1.1/include/" encountered. If this is to a local system header/library, it may cause problems (local system files make sense for compiling natively on your …Run Code Online (Sandbox Code Playgroud) 我无法让emscripten使用openGL着色器.该项目使用emscripten和gcc编译得很好但是当我尝试运行emscripten输出时失败.
我从编译顶点着色器得到的错误:
ERROR: 0:1: 'core' : invalid version directive
ERROR: 0:3: 'layout' : syntax error
Run Code Online (Sandbox Code Playgroud)
我从编译片段着色器得到的错误:
ERROR: 0:1: 'core' : invalid version directive
ERROR: 0:3: 'in' : storage qualifier supported in GLSL ES 3.00 only
ERROR: 0:3: '' : No precision specified for (float)
ERROR: 0:5: 'out' : storage qualifier supported in GLSL ES 3.00 only
ERROR: 0:5: '' : No precision specified for (float)
Run Code Online (Sandbox Code Playgroud)
我正在使用以下命令编译此项目:
em++ src/*.cpp -Iinclude/ -o test.html -std=c++11 -s USE_GLFW=3 -s FULL_ES3=1
Run Code Online (Sandbox Code Playgroud)
顶点着色器源:
#version 330 core …Run Code Online (Sandbox Code Playgroud) 假设我通过Emscripten _malloc(Javascript)在Javascript中分配一些内存M. 我是否允许将M的所有权传递给调用free(C++)的封送C++函数?
按照开发人员指南的步骤,它在MAC上失败了.
http://webassembly.org/getting-started/developers-guide/
我有一个干净的mac安装10.11.6 (15G31),这是日志.
Mac-MBP:emsdk_portable wasm$ ./emsdk activate clang-incoming-64bit emscripten-incoming-64bit sdk-incoming-64bit
Writing .emscripten configuration file to user home directory /Users/wasm/
The Emscripten configuration file /Users/wasm/.emscripten has been rewritten with the following contents:
import os
LLVM_ROOT='/Users/wasm/repo/webassembly/emsdk_portable/clang/fastcomp/build_incoming_64/bin'
NODE_JS='/Users/wasm/repo/webassembly/emsdk_portable/node/4.1.1_64bit/bin/node'
EMSCRIPTEN_ROOT='/Users/wasm/repo/webassembly/emsdk_portable/emscripten/incoming'
EMSCRIPTEN_NATIVE_OPTIMIZER='/Users/wasm/repo/webassembly/emsdk_portable/emscripten/incoming_64bit_optimizer/optimizer'
SPIDERMONKEY_ENGINE = ''
V8_ENGINE = ''
TEMP_DIR = '/var/folders/wk/mngy_vmn0xs6j32tm53vvg7m0000gn/T'
COMPILER_ENGINE = NODE_JS
JS_ENGINES = [NODE_JS]
To conveniently access the selected set of tools from the command line, consider adding the following directories to PATH, or call 'source ./emsdk_env.sh' to do … emscripten ×10
c++ ×5
webassembly ×5
javascript ×4
c ×2
asm.js ×1
glsl ×1
opengl ×1
opengl-es ×1
r ×1
sdl-2 ×1
wasi ×1
wasmtime ×1
webgl ×1
webgl2 ×1