当我想在"普通"程序中使用库时,我用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的脚本来构建它,但这听起来像是错误的方式.
我想将一个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) 我注意到,使用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代码?必须有办法避免这种情况.
当我尝试使用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) 我是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语言,这种类型的指针操作的细节目前还超出了我的范围.
我最近正在开展一个项目,其中包括 Emscripten 的使用。我可以在终端上安装并运行一些示例,但我想将其与 Clion 集成,以便我可以直接将 emscripten 包含到我的主项目中并构建它。我尝试将目录添加到CMakeList但在构建时出现错误。任何人都可以帮助我找到将 Emscripten 集成到 Clion 中的适当方法,或者对CMakeList. 任何帮助将不胜感激。感谢您宝贵的时间。
我将这些行包含在演示项目的 CMakeList 中:
\n\ncmake_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) 我想将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 文件中调用 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出现错误
Run Code Online (Sandbox Code Playgroud)abort(Assertion failed: native function `int_sqrt` called before runtime initialization)
每当我使用 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 程序。他们的文档中提到的
我应该怎么办?提前致谢
我正在运行一个使用 emscripten 编译为 wasm 的 C 工具。该工具适用于非常大的文件。在 CLI 上正常运行此工具时,通常操作会传输结果并在返回足够的数据后提前终止程序。例如你可以运行:
./tool <input-file> | head -n 100
该工具将在检测到 stdout 已被 关闭后终止head,实际上仅读取一小部分输入。
问题是带有 emscripten 的 stdout 似乎是异步的(通过覆盖 Module.print),因此该工具每次都会运行完成。有没有办法让它在标准输出上阻塞,这样我只能读取我需要的内容,然后终止该工具?
emscripten ×10
javascript ×7
c++ ×4
c ×3
webassembly ×3
cmake ×2
asm.js ×1
clion ×1
libc++ ×1
llvm ×1
llvm-clang ×1
opencv ×1
sdl ×1