标签: emscripten

在哪里为emscripten和CMake放置库

当我想在"普通"程序中使用库时,我用apt安装它们

apt-get install libjsoncpp-dev
apt-get install libassimp-dev
Run Code Online (Sandbox Code Playgroud)

然后在CMakeLists.txt中使用FIND_LIBRARY

FIND_LIBRARY(JSONCPP_LIBRARY NAMES jsoncpp)
TARGET_LINK_LIBRARIES(hello ${JSONCPP_LIBRARY})

FIND_LIBRARY(ASSIMP_LIBRARY NAMES assimp)
TARGET_LINK_LIBRARIES(hello ${ASSIMP_LIBRARY})
Run Code Online (Sandbox Code Playgroud)

在使用emscripten进行编译时,我显然必须以另一种方式安装库.我创建了一个目录$ HOME/emscripten-prefix,并使用--prefix = $ HOME/emscripten-prefix手动编译为静态库,并尝试使用CMAKE_INSTALL_PREFIX来查看该目录(类似于CMAKE_PREFIX_PATH):

cmake \
    -DCMAKE_TOOLCHAIN_FILE=$EMSCRIPTEN/cmake/Platform/Emscripten.cmake \
    -DCMAKE_BUILD_TYPE=Debug \
    -G "Unix Makefiles" \
    -DCMAKE_INSTALL_PREFIX=$HOME/emscripten-prefix
Run Code Online (Sandbox Code Playgroud)

不幸的是它没有用.strace透露,CMake会将CMAKE_FIND_ROOT_PATH(在$ EMSCRIPTEN/cmake/Platform/Emscripten.cmake中设置为"$ {EMSCRIPTEN_ROOT_PATH}/cmake")添加到所有路径.我尝试用-DCMAKE_FIND_ROOT_PATH更改它,但Emscripten.cmake覆盖了它.

这样做的正确方法是什么?我想我可以通过创建一个复制Emscripten.cmake并修改CMAKE_FIND_ROOT_PATH的脚本来构建它,但这听起来像是错误的方式.

c++ cmake emscripten

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

如何使用Emscripten将对象从Javascript传递到C++

我想将一个Javascript对象从JS传递回C++类/方法.我有以下简单的代码片段,它不起作用:

// Access JS objects in C++ like C++ objects

#include "emscripten/val.h"   //Causing errors !

using namespace emscripten;
int main() {
    val Math = val::global("Math");
    return Math.call("abs", -10); // returns 10
}
Run Code Online (Sandbox Code Playgroud)

我使用以下代码在Windows上使用emscripten进行编译:

cmd> emcc Access_Objects.cpp

我得到了很大的错误记录:

In file included from Access_Objects.cpp:2:
In file included from C:\Program Files\Emscripten\emscripten\1.16.0\system\inclu
de\emscripten/val.h:4:
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:2
4:5: error:
      unknown type name 'constexpr'
    constexpr bool has_unbound_type_names = true;
    ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:2
4:15: error:
      expected unqualified-id
    constexpr bool has_unbound_type_names = true;
              ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:5
6:21: error:
      use …
Run Code Online (Sandbox Code Playgroud)

javascript c++ llvm-clang emscripten

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

省略一些C++子系统

我注意到,使用emscripten,即使是相对较小的C++文件也可以很快变成相当庞大的JavaScript文件.例:

#include <memory>
int main(int argc, char** argv) {
  std::shared_ptr<int> sp(new int);
}
Run Code Online (Sandbox Code Playgroud)

使用像这样的命令用最近的emsdk编译它

em++ -std=c++11 -s DISABLE_EXCEPTION_CATCHING=1 -s NO_FILESYSTEM=1 \
     -s NO_BROWSER=1 -s NO_EXIT_RUNTIME=1 -O3 -o foo.js foo.cc
Run Code Online (Sandbox Code Playgroud)

生成的文件超过400k.随着-g抛出我可以做

grep -n '^function _' foo.js | c++filt -_
Run Code Online (Sandbox Code Playgroud)

看看我们在那里有什么样的功能.这里有些例子:

std::__1::moneypunct<char, false>::do_thousands_sep() const
std::__1::locale::~locale()
std::__1::basic_string<wchar_t, …>::~basic_string()
std::__1::time_get<…>::__get_day(…) const
std::__1::codecvt<wchar_t, char, __mbstate_t>::codecvt(unsigned int)
std::__1::locale::__imp::install(std::__1::locale::facet*, long)
_printf_core
Run Code Online (Sandbox Code Playgroud)

我自己并没有打电话给任何人,但是所有的功能都包括在内.可能其中许多都包含在一些虚拟功能表中.其他可能是由于一些静态初始化器.

如果这是正常的代码链接到我的硬盘驱动器上的某个共享库; 我不反对.但只需要一个共享指针,就可以传输半兆字节的JavaScript代码?必须有办法避免这种情况.

javascript c++ libc++ emscripten

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

如何让emcc工作?

当我尝试使用emcc将C代码编译为Javascript时,我收到以下错误:

emcc tests/hello_world.c 
CRITICAL root: fastcomp in use, but LLVM has not been built with the JavaScript backend as a target, llc reports:
===========================================================================
LLVM (http://llvm.org/):
  LLVM version 3.5.1
  Optimized build with assertions.
  Built Feb 22 2015 (00:08:56).
  Default target: x86_64-apple-darwin13.4.0
  Host CPU: corei7-avx

  Registered Targets:
    x86    - 32-bit X86: Pentium-Pro and above
    x86-64 - 64-bit X86: EM64T and AMD64
===========================================================================
CRITICAL root: you can fall back to the older (pre-fastcomp) compiler core, although that is not recommended, see https://github.com/kripken/emscripten/wiki/LLVM-Backend …
Run Code Online (Sandbox Code Playgroud)

llvm emscripten

6
推荐指数
2
解决办法
3191
查看次数

使用Emscripten将JavaScript数组字符串传递给C函数

我是WebAssembly和Emscripten的新手,我正在尝试将JavaScript中的字符串数组传递给C函数,以便进一步处理Module.cwrap(...).理想情况下,我还想从C返回一个字符串数组回JavaScript.

下面是我正在寻找的一些伪代码:

JS

const strings = ["foo", "bar", "fool", "gnar"]
const result = Module.cwrap("myCFunc", "array", ["array"])
console.log(result) // ["my", "transformed", "array"]
Run Code Online (Sandbox Code Playgroud)

C

char **myCFunc(char **input) {
    // do some processing. Specifically some md5 hashing...
    return output;
}
Run Code Online (Sandbox Code Playgroud)

我的猜测是我无法从JS到C函数自己传递多维数组,但是必须使用WebAssembly堆内存.我知道emscripten JS API支持这种类型的东西,但我还没有编写C语言,这种类型的指针操作的细节目前还超出了我的范围.

javascript c emscripten webassembly

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

将 Emscripten 集成到 Clion 中

我最近正在开展一个项目,其中包括 Emscripten 的使用。我可以在终端上安装并运行一些示例,但我想将其与 Clion 集成,以便我可以直接将 emscripten 包含到我的主项目中并构建它。我尝试将目录添加到CMakeList但在构建时出现错误。任何人都可以帮助我找到将 Emscripten 集成到 Clion 中的适当方法,或者对CMakeList. 任何帮助将不胜感激。感谢您宝贵的时间。

\n\n

我将这些行包含在演示项目的 CMakeList 中:

\n\n
cmake_minimum_required(VERSION 3.12)\n\nproject(projectShell)\n\nset(CMAKE_CXX_STANDARD 14)\nif (${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")\nset(CMAKE_C_COMPILER "emcc")\nendif ()\ninclude_directories(include/rapidjson)\ninclude_directories(/home/myfastcomp/emscripten/emscripten/system/include \n)\nadd_executable(projectShell main.cpp library.cpp library.h)\nif (${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")\nset_target_properties(projectShell PROPERTIES LINK_FLAGS "-o \ndist/projectShell.js -s USE_FREETYPE=1 -s DISABLE_EXCEPTION_CATCHING=0 -s DEMANGLE_SUPPORT=1 -s SAFE_HEAP=1 --bind -s WASM=1 -O2 -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 textures --preload-file shaders --preload-file …
Run Code Online (Sandbox Code Playgroud)

javascript c++ cmake emscripten clion

6
推荐指数
2
解决办法
3602
查看次数

如何使用opencv_contrib构建自定义opencv.js

我想将opencv_contrib中的xfeatures2D包含到opencv.js中.

我按照此文档构建OpenCV.js.一切都好.我有一个全新的opencv.js,我可以在我的html页面中使用,但它不包括xfeatures2D模块.

我将此文件更改为opencv/platforms/js/build_js.py以添加:

def get_cmake_cmd(self):
  cmd = ["cmake",
     "-DOPENCV_EXTRA_MODULES_PATH=/Users/me/git/opencv_contrib/modules",
     ... 
Run Code Online (Sandbox Code Playgroud)

现在cmake包含opencv_contrib模块.我可以看到编译的额外模块,但仍未包含在emscripten中.它看起来像javascript编译硬编码到opencv/modules/js.

是一种生成自己的opencv.js并选择删除或添加opencv和/或贡献模块的方法吗?

谢谢

洛朗

javascript opencv feature-detection emscripten

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

断言失败:在 .js 文件 ( emscripten ) 中调用 c 函数时,在运行时初始化错误之前调用本机函数 `int_sqrt`

我无法在另一个 JavaScript 文件中调用 C 函数,它给出错误“在运行时初始化之前调用”, 请参阅此链接

我按照给定链接中的描述在 emscripten 中编译了 C 代码,并在 test.js 文件中使用了生成的 asm.js 文件。用于生成 asm 的命令:-

emcc test/hello.cpp -o hello.html -s EXPORTED_FUNCTIONS="['_int_sqrt']" -s EXPORTED_RUNTIME_METHODS="["ccall", "cwrap"]"
Run Code Online (Sandbox Code Playgroud)

test.js 文件中的代码:

var Module = require('./asm.js');
var test =  Module.cwrap('int_sqrt', 'number', ['number']);
console.log(test(25));
Run Code Online (Sandbox Code Playgroud)

当我运行时node test出现错误

abort(Assertion failed: native function `int_sqrt` called before runtime initialization)
Run Code Online (Sandbox Code Playgroud)

emscripten asm.js

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

如何在只有画布的情况下摆脱 emscripten 徽标和控制台?

每当我使用 emscripten 编译 C 代码时,emcc main.c -o index.html都会生成一个 html 文件,其中包含其徽标、一些按钮和控制台。但我不想要那些。我只想要可以显示 SDL 渲染内容的画布。

我做了一些研究,并在堆栈溢出中发现了这个问题。显然你必须输入emcc --shell-file一些模板 html 作为参数。

所以我制作了一个模板html文件,如下所示

<html>
   <head>
      <title>Some title</title>
   </head>
   <body>
   </body>
</html>
Run Code Online (Sandbox Code Playgroud)

但当我运行时却emcc main.c -o index.html --shell-file template.html出错了。显然 emscripten 寻找一些类似的想法 - {{{ SCRIPT }}}

所以我添加到了{{{ SCRIPT }}}我的身体里。它编译得很好。但是当我运行时,index.html控制台localhost:3000中出现错误,显示cannot find addEventListener of undefined.

[注意,我正在运行 SDL 程序。他们的文档中提到的

我应该怎么办?提前致谢

javascript c sdl emscripten webassembly

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

Emscripten - 有没有办法限制对标准输出的写入?

我正在运行一个使用 emscripten 编译为 wasm 的 C 工具。该工具适用于非常大的文件。在 CLI 上正常运行此工具时,通常操作会传输结果并在返回足够的数据后提前终止程序。例如你可以运行:

./tool <input-file> | head -n 100

该工具将在检测到 stdout 已被 关闭后终止head,实际上仅读取一小部分输入。

问题是带有 emscripten 的 stdout 似乎是异步的(通过覆盖 Module.print),因此该工具每次都会运行完成。有没有办法让它在标准输出上阻塞,这样我只能读取我需要的内容,然后终止该工具?

javascript c emscripten webassembly

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