标签: emscripten

使用 Emscripten 在 C 代码中回调 javascript 函数

任务是调用 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_fnmy_js_fn

javascript c callback emscripten

2
推荐指数
1
解决办法
1075
查看次数

如何在 javascript (emscripten) 中覆盖 c++ malloc/free?

我通过包装原始函数并仅添加 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)

c++ emscripten

2
推荐指数
1
解决办法
1959
查看次数

C++ 类中的成功回调 Emscripten FETCH API

我正在使用 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)

c++ emscripten webassembly fetch-api

2
推荐指数
1
解决办法
1506
查看次数

如果有的话,如何检测 CMakeLists.txt 是由“emcmake cmake”而不是“cmake”运行的?

cmake我有一个项目,在使用或emcmake cmake(分别后跟make或)时应以不同的方式配置/构建emmake make。例如,如果运行测试可执行文件,我不需要构建它,emcmake cmake因为结果将是 WebAssembly。

那么,运行时是否有任何可用的变量emcmake cmake可供我查询?还有其他方法吗?

cmake emscripten emcmake

2
推荐指数
1
解决办法
1483
查看次数

为什么没有LAPACK 3.5.0的C端口可用?

我的目标是使用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 fortran lapack emscripten

1
推荐指数
1
解决办法
347
查看次数

指定 C 编译器的头文件位置(使用 emscripten 编译 R 代码)

我在编译 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 函数。对这个想法的任何见解将不胜感激。

javascript c r emscripten

1
推荐指数
1
解决办法
3154
查看次数

在Emscripten中使用SDL2 RenderDraw函数

我一直在努力移植一个简单​​的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 …

sdl emscripten

1
推荐指数
1
解决办法
1767
查看次数

C++ Lambda导致'候选函数不可行:'

添加捕获元素时,为什么以下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)

c++ lambda emscripten

1
推荐指数
1
解决办法
462
查看次数

Emscripten OpenGL (3) 给出版本错误

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)

javascript c++ emscripten webgl2

1
推荐指数
1
解决办法
1651
查看次数

来自 CMake 的 Emscripten 库无法链接

我在 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)

所以我根据 …

c++ makefile cmake emscripten gdcm

1
推荐指数
1
解决办法
1847
查看次数

标签 统计

emscripten ×10

c++ ×5

c ×3

javascript ×3

cmake ×2

callback ×1

emcmake ×1

fetch-api ×1

fortran ×1

gdcm ×1

lambda ×1

lapack ×1

makefile ×1

r ×1

sdl ×1

webassembly ×1

webgl2 ×1