任务是调用 JavaScript 函数作为回调,以显示 while 循环操作的进度。例如:
var my_js_fn = function(curstate, maxstate){//int variables
console.log(curstate.toString() + " of " + maxstate.toString());
}
Run Code Online (Sandbox Code Playgroud)
C伪代码:
int smth_that_calls_my_fn(int i, int max) {
/*
the_magic to call my_js_fn()
*/
}
int main(){
//....
while (i < max){
smth_that_calls_my_fn(i,max);
}
//....
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我如何链接smth_that_calls_my_fn和my_js_fn?
我通过包装原始函数并仅添加 Console.log 来显示内存地址、大小和分配的总内存,从而覆盖 Javascript(emscripten) 中的 Module._malloc 和 Module._free。
我发现新函数仅捕获对 Module._malloc 和 Module._free 的 Javascript 调用,并且不能捕获对 malloc() 和 free() 的 C++ 级别调用。我想知道为什么。
根据Ofria先生的回答/sf/answers/2384014391/,Module._malloc和Module._free是c++的malloc()和free()转换后的等效代码。
我正在使用 emscripten 1.35.0
编辑:继承人如何将函数包装在 javascript 中
var _defaultMalloc = Module._malloc;
var _defaultFree = Module._free;
var _totalMemoryUsed = 0;
var _mallocTracker = {};
Module._malloc = function(size) {
_totalMemoryUsed += size;
var ptr = _defaultMalloc(size)
_mallocTracker[ptr] = size;
console.log("MALLOC'd @" + ptr + " " + size + " bytes -- TOTAL USED " + _totalMemoryUsed + " …Run Code Online (Sandbox Code Playgroud) 我正在使用 WebAssembly 并尝试从 C++ 发出 HTTPS 请求。我看过Emscripten FETCH API的解决方案并尝试使用它。
为了测试它,我创建了一个Test类,在其中发送如下请求:
void Test::sendRequest() {
emscripten_fetch_attr_t attr;
emscripten_fetch_attr_init(&attr);
strcpy(attr.requestMethod, "GET");
attr.attributes = EMSCRIPTEN_FETCH_LOAD_TO_MEMORY;
attr.onsuccess = &Test::onSuccess;
attr.onerror = &Test::onError;
emscripten_fetch(&attr, "http://127.0.0.1:5000/");
}
Run Code Online (Sandbox Code Playgroud)
我的 onSuccess 回调如下所示:
void Test::onSuccess(struct emscripten_fetch_t *fetch) {
printf("Finished downloading %llu bytes from URL %s.\n", fetch->numBytes, fetch->url);
setText(QString::fromUtf8(fetch->data));
emscripten_fetch_close(fetch); // Free data associated with the fetch.
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试编译时出现错误:
error: assigning to 'void (*)(struct emscripten_fetch_t *)' from incompatible type 'void
(Test::*)(struct emscripten_fetch_t *)'
attr.onsuccess = &Test::onSuccess;
^~~~~~~~~~~~~~~~ …Run Code Online (Sandbox Code Playgroud) cmake我有一个项目,在使用或emcmake cmake(分别后跟make或)时应以不同的方式配置/构建emmake make。例如,如果运行测试可执行文件,我不需要构建它,emcmake cmake因为结果将是 WebAssembly。
那么,运行时是否有任何可用的变量emcmake cmake可供我查询?还有其他方法吗?
我的目标是使用LAPACK和Emscripten.Emscripten能够将C代码转换为JavaScript.但遗憾的是,LAPACK 3.5.0(http://www.netlib.org/lapack/)仅适用于FORTRAN95.
CLAPACK项目(http://www.netlib.org/clapack/)基本上就是我想要的:LAPACK的C版本.但是这个已经过时了; 最新的是3.2.1.
所以现在我的问题是:为什么没有更新的LAPACK端口到C?有什么建议如何实现我的目标?
提前致谢!
我设法将LAPACK,LAPACK C-wrapper移植到javascript.然而,我无法使用它,因为包装器使用内部FORTRAN例程.我如何在emscripten中嵌入这些内容?
例如,函数LAPACKE_cgbcon使用仅在FORTRAN中可用的LAPACKE_xerbla.为什么我会从移植包装器中受益?
我在编译 C 代码方面相对缺乏经验。不过,我正在尝试使用 emscripten 将 R 源代码中的算法编译为 JavaScript。该函数位于此处调用的文件中pf.c
天真地,我刚刚进入src目录并尝试:
emcc nmath/pf.c
Run Code Online (Sandbox Code Playgroud)
这导致:
In file included from nmath/pf.c:25:
nmath/nmath.h:38:10: fatal error: 'Rconfig.h' file not found
#include <Rconfig.h>
^
1 error generated.
ERROR root: compiler frontend failed to generate LLVM bitcode, halting
Run Code Online (Sandbox Code Playgroud)
我知道这个标题在哪里:
$ find . -name "Rconfig.h"
./gnuwin32/fixed/h/Rconfig.h
Run Code Online (Sandbox Code Playgroud)
我的直接问题是,我如何告诉编译器这个头文件在哪里?我想最终得到一个pfJavaScript 函数。对这个想法的任何见解将不胜感激。
我一直在努力移植一个简单的C程序,使用emscripten将SDL2用于图形处理.我扫描了示例程序,但无法找到使用SDL_RenderDrawPoint,SDL_RenderDrawLine或SDL_RenderDrawRect绘制到屏幕的程序.这些函数适用于我的程序的windows/ubuntu版本,但不适用于emscripten版本.我只是看到屏幕涂有清晰的颜色,但没有任何吸引力.
这是展示问题的示例代码.
#include <stdio.h>
#include <SDL2/SDL.h>
#include <assert.h>
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
#endif
int main(int argc, char* argv[])
{
// setup
SDL_Window * window;
SDL_Renderer * renderer;
assert(SDL_Init(SDL_INIT_VIDEO) == 0);
SDL_CreateWindowAndRenderer(640, 320, 0, &window, &renderer);
// clear screen with red color
SDL_SetRenderDrawColor(renderer, 200, 0, 0, 255);
SDL_RenderClear(renderer);
// draw green line across screen
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
SDL_RenderDrawLine(renderer, 0, 0, 640, 320);
SDL_RenderPresent(renderer);
SDL_Delay(2000);
// free resources
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我将此代码保存到main.c然后运行:
emcc main.c -s USE_SDL=2 -o …
添加捕获元素时,为什么以下lambda不符合签名?
[&callback](unsigned handle, void* userData, void* data, unsigned size) -> void { ... }
Run Code Online (Sandbox Code Playgroud)
但这会吗?
[](unsigned handle, void* userData, void* data, unsigned size) -> void { ... }
Run Code Online (Sandbox Code Playgroud)
签名:
typedef void (*em_async_wget2_data_onload_func)(unsigned, void*, void*, unsigned);
Run Code Online (Sandbox Code Playgroud) OS X - 铬。
我是 OpenGL / emscripten 的新手,并试图设置一个使用 WebGL 2、OpenGL 3+ 并通过 emscripten 构建到 webassembly 的简单脚本。
编译 WebGL 1 / OpenGL 2 没有问题。并将画布设置为 WebGL 2 / OpenGL 3 似乎也有效。当我检查正在运行的当前版本时,它会通知我关于 OpenGL 3.0 和 WebGL2(但也许它没有使用它......?)。
但是,emcc 仍然尖叫着关于着色器的错误,我给出的着色器仅与 3.0+ 版本兼容,从而暗示我正在运行 openGL 1/2 ?
通过 emscripten 设置新的上下文
EmscriptenWebGLContextAttributes ctxAttrs;
emscripten_webgl_init_context_attributes(&ctxAttrs);
ctxAttrs.alpha = GL_TRUE;
ctxAttrs.depth = GL_TRUE;
ctxAttrs.stencil = GL_TRUE;
ctxAttrs.antialias = 4;
ctxAttrs.premultipliedAlpha = false;
ctxAttrs.preserveDrawingBuffer = false;
ctxAttrs.minorVersion = 0;
ctxAttrs.majorVersion = 2; // WebGL2
this->context = emscripten_webgl_create_context(0, &ctxAttrs);
assert(this->context > 0); …Run Code Online (Sandbox Code Playgroud) 我在 Windows 10 64 位平台上使用 Grassroot Dicom 查看器版本 2.8.9 编译成 Emscripten 库 bc。
我按照本网站的说明进行操作
emconfigure cmake .
emmake make VERBOSE=1
Run Code Online (Sandbox Code Playgroud)
之后,我得到了以 .a 而不是 .bc 结尾的库文件,类似于
libgdcmcharls.a libgdcmCommon.a libgdcmDICT.a ....
当我查看它开头的每个静态库文件的汇编代码时
!拱。/
代替
公元前
如教程网站中所述注意
使用上述过程,某些构建系统可能无法正确发出位代码,您可能会看到无效的位代码警告。您可以运行 file 来检查文件是否包含位码(您也可以手动检查内容是否以 BC 开头)。还值得运行 emmake make VERBOSE=1 这将打印出它运行的命令 - 您应该看到正在使用 emcc,而不是本机系统编译器。如果不使用 emcc,您可能需要修改 configure 或 cmake 脚本。
我认为这是我无法生成内容以 BC 开头的库的问题,但我得到了!拱 ./ ?
当然这些文件不能从 emcc 链接(找不到参考错误)
error: undefined symbol: _ZN4gdcm11ImageReader8GetImageEv
error: undefined symbol: _ZN4gdcm11ImageReaderC1Ev
error: undefined symbol: _ZN4gdcm11ImageReaderD1Ev
error: undefined symbol: _ZN4gdcm5Trace14GetErrorStreamE
Run Code Online (Sandbox Code Playgroud)
所以我根据 …