我想在 C++ 中创建一个std::vector(特别是 a std::vector<string>),然后将它(或者更确切地说,指向它的指针)传递给 Javascript,以便能够从直接编写的 Javascript 访问其数据/函数。
到目前为止我可以获得整数指针:
vector<string> myVector;
myVector.push_back("First item");
myVector.push_back("Second item");
EM_ASM_ARGS({
// Prints out an integer value of the pointer,
// but I would like to access the object members/data
// of myVector
console.log($0);
}, &myVector);
Run Code Online (Sandbox Code Playgroud)
我在http://kripken.github.io/emscripten-site/docs/api_reference/bind.h.html#register_vector__cCP和http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript找到了信息/embind.html#built-in-type-conversions关于该register_vector函数
#include <emscripten/bind.h>
EMSCRIPTEN_BINDINGS(Wrappers) {
register_vector<std::string>("VectorString");
};
Run Code Online (Sandbox Code Playgroud)
它可以用来从 Javascript 世界创建一个新的向量:
var myVector = new Module.VectorString();
Run Code Online (Sandbox Code Playgroud)
但我不知道如何使用它来访问 C++ 世界中已经存在的向量。
Module.Runtime.dynCall('v', $0, []);如果我尝试在指针上使用,如/sf/answers/2052360831/中传递函数指针时,则会出现错误:
Invalid function pointer '380' called …
我有一个 C 函数编译到 asm.js 中,参数如下:
void myfunc(double v1[], double v2[], int v_size, double c)
Run Code Online (Sandbox Code Playgroud)
它接受一个数组 ( v1),应用一个转换,然后v2用输出填充另一个相同大小的数组 ( )。
我编译它,然后运行以下JS代码:
v1 = new Array(1.0, 1.5, 2.0);
v2 = Module._malloc(8 * v1.length);
Module.ccall("myfunc", null, ["array", "number", "number", "number"], [v1, v2, v1.length, 2]);
Run Code Online (Sandbox Code Playgroud)
但是,当我运行时,getValue(v2, "double")我得到 1.297703e-318(这是错误的),而当我运行getValue(v2 + 8, "double")或getValue(v2 + 16, "double")它返回 0(这也是错误的)。
我已将 C 函数简化为仅控制台注销其内容v1并打印出垃圾数据,因此至少在读取传入的双数组时存在问题。更具体的问题是:
我正在使用C ++的Google测试框架。每个文件都包含一个config.hpp,它定义了一个全局配置变量。我想在变量而不是编译时const或中定义我的配置constexpr。如何定义依赖项,以便在链接在一起的不同文件中具有相同的变量?我必须使用单身人士吗?我可以避免吗?有没有更好的推荐方法来使用多个测试文件的xUnit样式?
我的配置文件 config.hpp:
#pragma once
struct {
const float tolerance = 0.001;
// ...
} CONFIG_VAR;
Run Code Online (Sandbox Code Playgroud)
每个测试* .cpp源文件都类似于:
#include "gtest/gtest.h"
#include "core/config.hpp"
TEST(a, b) { ... }
Run Code Online (Sandbox Code Playgroud)
我的主文件:
#include "gtest/gtest.h"
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Run Code Online (Sandbox Code Playgroud)
我使用以下命令进行编译和链接:
em++ -I $GTEST_ROOT/googletest/include main_all_tests.cpp test_*.cpp
Run Code Online (Sandbox Code Playgroud)
PS。我的问题是变量CONFIG_VAR的多个定义。
我的解决方案基于一个相关的问题。
最新的emscripten使用什么版本的 LLVM ?我用谷歌搜索了一段时间,但找不到任何信息。背景是我有一些需要 clang-5.0 的 C++ 代码——它用 emscripten 编译的可能性有多大?或者至少需要 clang-4.0 的代码?
我有一个要编译为 Web 程序集的 CMake 项目。为此,我使用了项目基本文件夹中的以下命令:
mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=/home/ubuntu/emsdk/emscripten/1.38.6/cmake/Modules/Platform/Emscripten.cmake -G "Unix Makefiles"
Run Code Online (Sandbox Code Playgroud)
这成功地(或至少我认为)生成了一个.wasm文件和一个.js文件以及各种 cmake 和 make 文件。
我还希望它生成一个 html 文件,就像你可以使用emcc(即emcc example.c -s WASM=1 -o output.html)。
是否有可能做到这一点?
我正在尝试使用 i64 生成一个 .wat 文件,但它只是编译为 i32。
在我使用 int 和 int64_t 测试的 C 代码中,但我没有成功。
这是C代码:
#include <stdio.h>
#include <stdint.h>
#define MAX 64
int main(void) {
int64_t v1[MAX], v2[MAX], v3[MAX];
int64_t i;
for(i = 0; i < MAX; i++)
v3[i] = v1[i] + v2[i];
for(i = 0; i < MAX; i++)
printf("%llu\n", v3[i]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后我使用 CLI 编译为 .wasm 和 .wat 格式:
$ emcc -Oz ex1.c -s WASM=1 -s SIDE_MODULE=1 -s ONLY_MY_CODE=1 -o ex1.wasm
$ wasm2wat ex1.wasm -o ex1.wat
Run Code Online (Sandbox Code Playgroud)
这是编译的 .wat …
在 emscripten C++ 中,我有
class MyClass {
public:
MyClass() {}
std::shared_ptr<std::vector<uint8_t>> buffer;
int getPtr() {
return (int)(buffer->data());
}
int getLength() {
return buffer->size();
}
};
EMSCRIPTEN_BINDINGS() {
class_<MyClass>("MyClass").constructor()
.function("getLength",&MyClass::getLength)
.function("getPtr",&MyClass::getPtr,
allow_raw_pointers());
}
Run Code Online (Sandbox Code Playgroud)
我可以从 JS 调用 getLength() 和 getPtr() 但我不知道如何让 JS 将其视为 ArrayBuffer 以作为 Blob 下载。
如何将缓冲区数据以某种形式导入 JS,然后我可以使用类似于https://github.com/kennethjiang/js-file-download/blob/master/file-download.js 的代码下载它。
我需要在浏览器端解码 h264 数据,因为我使用 emscripten 在 web 程序集中使用 openh264 库构建。我已经成功构建它并尝试在 java 脚本中使用它来解码 h264 数据。但是我在以下行中遇到一个错误,
var open_decoder = Module.cwrap('open_decoder', 'number', null);
Run Code Online (Sandbox Code Playgroud)
错误是:未捕获的类型错误:Module.cwrap 不是函数
如果有人使用 emscripten 构建了 openh264,请帮我找出问题。
按照我使用 emscripten 构建 openh264 的步骤。
注意:openh264的代码已经从github(ttyridal)下载,已经有emscripten的make文件。
我在将 javascript 文件导入 vue.js 组件时遇到错误:
这是 /components 子文件夹的内容:
/startingV/src/components$ ls -lah
total 132K
drwxr-xr-x 2 marco marco 4,0K dic 26 11:22 .
drwxr-xr-x 5 marco marco 4,0K dic 26 09:32 ..
-rw-r--r-- 1 marco marco 441 nov 2 2016 Counter.vue
-rw-r--r-- 1 marco marco 441 dic 21 15:13 FormValidation.vue
-rw-r--r-- 1 marco marco 100K dic 26 10:38 js_plumbing.js
-rw-r--r-- 1 marco marco 9,3K dic 26 10:38 js_plumbing.wasm
-rw-r--r-- 1 marco marco 473 dic 26 11:14 Result.vue
Run Code Online (Sandbox Code Playgroud)
编译时:
Failed to compile. …Run Code Online (Sandbox Code Playgroud) 我知道 clang(通过使用 target=wasm32)和 emscripten 都可以将 C 代码编译成 webassembly,但它们有什么不同?
看起来他们都使用 LLVM 作为后端。其实,我什至不太明白 llvm 和 clang 之间的关系......
我已经阅读了一段时间的 WebAssembly,但我对它缺乏低级理解。非常感谢您的参与!!
emscripten ×10
webassembly ×6
javascript ×4
c++ ×3
c ×2
llvm ×2
arraybuffer ×1
asm.js ×1
clang ×1
cmake ×1
firefox ×1
googletest ×1
module ×1
openh264 ×1
vue.js ×1
wasi ×1
x86-64 ×1