标签: emscripten

我如何有条件地编译emscripten的代码?

使用支持构建多个操作系统的代码库,只有在需要对Emscripten进行修改时才能将它们集成到同一代码库中,并在条件编译的帮助下使其继续在其他环境中工作.

但是,似乎没有任何关于这个主题的文档,这对我来说似乎很糟糕,我也无法找到任何关于它的问题,这对我来说似乎非常令人惊讶 - 我预计它会被很好地践踏并记录下来.

我怎样才能做到这一点?

(我看过tools/shared.py,这似乎暗示#ifdef EMSCRIPTEN或者#ifdef __EMSCRIPTEN__可以使用;我仍然会问这个问题,以确定我是否正确,如果这是正确的方法,甚至可能应该使用它.)

conditional-compilation emscripten

9
推荐指数
2
解决办法
3499
查看次数

emscripten webworker的最小工作示例

我正在尝试使用emscripten在C++中构建一个基本的webworker示例.API看起来很简单,但我无法让它工作.我实际上想在我的项目中实现这个功能,但是在失败后试图做一个最小的例子它也不起作用.

我有main.cpp:

#include <emscripten/emscripten.h>
#include <emscripten/bind.h>
#include <iostream>

namespace e = emscripten;

int counter = 0;

void cback(char* data, int size, void* arg) {
    std::cout << "Callback" << std::endl;
    counter++;
}

void loop() {
    std::cout << "Counter: " << counter << std::endl;
}

int main() {
    std::cout << "Main func." << std::endl;
    worker_handle worker = emscripten_create_worker("worker.js");
    emscripten_call_worker(worker, "one", 0, 0, cback, (void*)42);

    emscripten_set_main_loop(loop, 2, true);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

和worker.cpp:

#include <iostream>
#include <emscripten/emscripten.h>

extern "C" {

void one(char* data, int …
Run Code Online (Sandbox Code Playgroud)

javascript c++ web-worker emscripten

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

如何从C/C++访问WebAssembly线性内存

我正在编写一个小型C程序,旨在编译为ism w/emcc并在Web浏览器中运行.因为wasm导出的函数只能接受简单的数值作为参数输入和返回值,所以我需要在JavaScript API和编译的WebAssembly代码之间共享内存,以便访问更复杂的数据类型,如字符串或char数组.问题是我不能为我的生活弄清楚如何从我的C程序内部访问WebAssembly线性内存.

我的最终目标是能够在我的C程序中读取在JavaScript中初始化的字符串,然后在Web浏览器的JavaScript代码中读取在我的C程序中修改/初始化的字符串.

这是我正在尝试做的基本示例:

main.js

const importObject = {
  'env': {
    'memoryBase': 0,
    'tableBase': 0,
    'memory': new WebAssembly.Memory({initial: 256}),
    'table': new WebAssembly.Table({initial: 0, element: 'anyfunc'})
  }
}

// using the fetchAndInstantiate util function from
// https://github.com/mdn/webassembly-examples/blob/master/wasm-utils.js
fetchAndInstantiate('example.wasm', importObject).then(instance => {

      // call the compiled webassembly main function
      instance.exports._main()
      console.log(importObject.env.memory)
})
Run Code Online (Sandbox Code Playgroud)

example.c

int main() {
    // somehow access importObject.env.memory 
    // so that I can write a string to it
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个问题让我成为了那里的一部分,但是,我仍然不明白如何从我的C代码中的WebAssembly内存缓冲区读/写.

emscripten webassembly

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

Wasm:未捕获(在承诺中)TypeError:导入#0 module =“env”错误:模块不是对象或函数Promise.then(异步)(匿名)@(索引):9

我是 emscripten 的新手,发现它非常困难...我有义务在 Windows 上工作,因为我必须测试我的应用程序的 .exe 版本。我用的是Windows 7。

我可以编译 wasm 但 javascript 无法读取它。这是我的代码。

C代码:

char * HelloWorld ()
{
    return "Hello World !";
}
Run Code Online (Sandbox Code Playgroud)

Emscripten 命令行:

emcc hello.c -O2 -s ONLY_MY_CODE=1 -s WASM=1 -s SIDE_MODULE=1 -s EXPORTED_FUNCTIONS="['_HelloWorld']" -o hello.wasm
Run Code Online (Sandbox Code Playgroud)

瓦特结果:

(module
  (type $t0 (func (result i32)))
  (type $t1 (func))
  (import "env" "memory" (memory $env.memory 256))
  (import "env" "memoryBase" (global $env.memoryBase i32))
  (func $_HelloWorld (export "_HelloWorld") (type $t0) (result i32)
    (get_global $env.memoryBase))
  (func $__post_instantiate (export "__post_instantiate") (type $t1)
    (set_global $g1
      (i32.add …
Run Code Online (Sandbox Code Playgroud)

javascript c emscripten webassembly

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

如何在 JetBrains CLion 中使用 `cmake` 来编译 Emscripten/WebAssembly?

我正在尝试正确设置JetBrains CLion 2019.1以从C源代码构建WebAssembly。我几乎尝试了所有方法,但是,没有任何效果。我没有得到任何WebAssembly构建。我得到的是:

  • WasmText.js
  • WasmTest.js.mem
  • WasmTest.cbp

当我em++ main.cpp -o out/index.html -s WASM=1 -O3在命令行上运行时,我实际上得到了

  • index.html
  • index.js
  • index.wasm

结果的尺寸也小得多。

我已经使用以下设置设置了构建、执行、部署-> CMake配置:

构建类型

最小相对

工具链

使用默认值:系统

(我曾尝试使用 emscripten sdk 设置我自己的工具链,但是,CLion 对设置执行了一些测试,并抱怨它无法使用em++.

CMake 选项

$EMSCRIPTEN_ROOT$在 CLion 中设置了一个路径变量。我可以确认它可以正常工作,将它传递${EMSCRIPTEN_ROOT}CMakeLists.txtas 参数。

-DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN_ROOT}/cmake/Modules/Platform/Emscripten.cmake
-G"Unix Makefiles"
--debug-output
Run Code Online (Sandbox Code Playgroud)

环境

EMSDK=/wrk/dev/emsdk
EMSCRIPTEN=/wrk/dev/emsdk/emscripten/1.37.12
EMSDK_NODE=/wrk/dev/emsdk/node/4.1.1_64bit/bin/node
LLVM_ROOT=/wrk/dev/emsdk/clang/e1.37.12_64bit
BINARYEN_ROOT=/wrk/dev/emsdk/clang/e1.37.12_64bit/binaryen
EMSCRIPTEN_NATIVE_OPTIMIZER=/wrk/dev/emsdk/clang/e1.37.12_64bit/optimizer
EM_CONFIG=/home/webmaster/.emscripten
PATH=/wrk/dev/emsdk:/wrk/dev/emsdk/clang/e1.37.12_64bit:/wrk/dev/emsdk/node/4.1.1_64bit/bin:/wrk/dev/emsdk/emscripten/1.37.12:/bin:/usr/bin:/usr/lib/bin
Run Code Online (Sandbox Code Playgroud)

构建选项

-j 2

(字段为空时自动设置)

源文件

#include <iostream>

int main()
{
  std::cout << …
Run Code Online (Sandbox Code Playgroud)

c++ cmake emscripten clion webassembly

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

在 Chrome 中调试 WebAssembly

我是 WebAssembly 的新手,但我已经使用它和 Emscripten 大约一个月了,并且对最小的构建工具包相当熟悉。

在调试方面,我发现我找不到如何充分利用 Chrome 和 Firefox 环境。

在 Firefox 68.0.1 中,我的 Source Map 文件加载,我可以将它们正确映射到我的 C/C++ 源文件。

但是,我无法看到本地堆栈。我可以看到所有的局部变量,但是当我逐步执行我的 wasm 代码时,当 FF 显示它时,它将事物推送到我看不到的堆栈中,并且手动跟踪它是一种痛苦。

相比之下,Chrome 76 给了我堆栈,让我添加 Source Map 来查看我的 C/C++ 引用,但我无法让它给我任何类型的 wasm 代码来逐步完成,要么是我自己的垃圾文件,要么自己的拆解版。

我从节点 http-server 或 emscripten emrun 加载的所有 wasm 在 DevTools 的“Sources”选项卡中向我展示了我的源代码,但在 localhost 下还有一个标记为“top/(无域)”的节点。我试过加载一个简单的模块但没有成功。

简单的你好世界演示

我想弄清楚如何在 FireFox 中查看本地堆栈或让 Chrome 向我展示 wasm 反汇编(最好是两者)。Chrome 似乎为 WebAssembly Studio 这样做,我不知道为什么

在此处输入图片说明

google-chrome-devtools emscripten firefox-developer-tools webassembly

9
推荐指数
0
解决办法
794
查看次数

如何通过“emcmake cmake/emmake make”传递“emcc”选项?

我有一个 CMake 项目 (C++),我想通过 WebAssembly 在 JavaScript 中使用它。为了配置它,我使用emcmake cmake和 来构建它emmake make。当我手动执行此操作时,我可以成功编译部分:

emcc --bind test.cpp
Run Code Online (Sandbox Code Playgroud)

但我想从 的优势中获利emmake--bind我需要的参数emccemmake默认情况下不添加它,这会导致错误:

error: undefined symbol: _embind_register_function (referenced by top-level compiled C/C++ code)
Run Code Online (Sandbox Code Playgroud)

那么,在使用 构建时如何添加它emmake make?我可以将它传递给吗emmake?或者我可以添加一些东西到我的CMakeLists.txt吗?


麦克雷:

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project(MyTest)
add_executable(mytest test.cpp)
Run Code Online (Sandbox Code Playgroud)

test.cpp:

cmake_minimum_required(VERSION 2.8)
project(MyTest)
add_executable(mytest test.cpp)
Run Code Online (Sandbox Code Playgroud)

c++ cmake emscripten emmake emcmake

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

使用 Emscripten 导出所有函数

我想通过 JavaScript 以简单的方式使用 C 源代码(仅使用免费/自由软件)。所以 Emscripten 似乎是一个不错的选择。https://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html

有一个导出一个函数的例子:

emcc tests/hello_function.cpp -o function.html -s EXPORTED_FUNCTIONS="['_int_sqrt']"
Run Code Online (Sandbox Code Playgroud)

但是有许多函数与在 JavaScript 中使用相关。此外,似乎我将不得不为访问结构成员添加更多内容。从 emscripten 访问结构域

所以,我想知道是否可以在不创建包含所有名称的大数组的情况下导出所有函数(除了 libc 的函数),即使这可能是 JS 大小问题和效率问题。

问候。

javascript llvm emscripten

8
推荐指数
2
解决办法
6232
查看次数

Emscripten - cmake - 在CMakeList文件中传递emscripten选项

如何使用emcmake cmake和传递emscripten命令行选项?

相当新的c ++/CMake,但在谷歌上找不到任何有用的东西.所以也许问题只是愚蠢,在这种情况下我道歉.

我可以使用以下CMakeList.txt文件构建我的项目(非webassembly /普通桌面)

cmake_minimum_required(VERSION 3.7)
project(Engine)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
set(CMAKE_INCLUDE_PATH /usr/local/include)
set(SOURCE_FILES main.cpp src/Background.cpp src/Background.h src/Camera.cpp src/Chart.cpp src/Chart.h src/logger.cpp src/Engine.cpp src/Engine.h src/GL.cpp src/GL.h src/Instrument.cpp src/Instrument.h)
set(EMCC_LINKER_FLAGS "-s SAFE_HEAP=1 --bind -s WASM=1 -O3 -o ../index.js -s LEGACY_GL_EMULATION=0  -s GL_UNSAFE_OPTS=0 --pre-js pre-module.js --post-js post-module.js -s ASSERTIONS=1 -s GL_ASSERTIONS=1 -s INVOKE_RUN=0  -std=c++11 -s USE_WEBGL2=1 -s FULL_ES3=1 -s USE_GLFW=3 -s OFFSCREENCANVAS_SUPPORT=1 --preload-file shaders --preload-file extern --use-preload-plugins")
set(CMAKE_REQUIRED_FLAGS "${EMCC_LINKER_FLAGS}")

find_package(OPENGL REQUIRED)
find_package(GLEW REQUIRED)
#find_package(SDL2 REQUIRED)
find_package(glfw3 REQUIRED)
find_package(assimp …
Run Code Online (Sandbox Code Playgroud)

c++ cmake emscripten webassembly

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

编译着色器后程序停止绘制

我正在研究要编译为WASM并在浏览器中显示图像的C程序。该程序的重​​点是学习使用EGL进行设置,因此,我对涉及SDL,GLFW等的任何答案都不感兴趣。

此代码可将屏幕清除为蓝色(我省略了错误检查以减小尺寸):

#include <GLES2/gl2.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "emscripten.h"

struct Environment
{
    EGLint majorVersion;
    EGLint minorVersion;

    EGLDisplay display;
    EGLSurface surface;
};

static struct Environment g_env = {};

bool initGL(struct Environment* env)
{
    env->display = eglGetDisplay(EGL_DEFAULT_DISPLAY);

    eglInitialize(env->display, &env->majorVersion, &env->minorVersion);

    EGLint numConfigs = 0;
    EGLint attribList[] = 
    {
        EGL_RED_SIZE, 5,
        EGL_GREEN_SIZE, 6,
        EGL_BLUE_SIZE, 5,
        EGL_DEPTH_SIZE, 1,
        EGL_NONE
    };
    EGLConfig config;
    eglChooseConfig(env->display, attribList, &config, 1, &numConfigs);

    env->surface = eglCreateWindowSurface(env->display, config, 0, NULL);

    static const …
Run Code Online (Sandbox Code Playgroud)

opengl-es opengl-es-2.0 egl emscripten

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