标签: emscripten

如何在Mac上使用Emscripten emcc和make时包含ncurses

我正在尝试使用Emscripten的emcc 构建一个项目(即Angband的源代码 - http://rephial.org/downloads/3.3/angband-v3.3.2.tar.gz),以便将其移植到Javascript并最终构建一个在线版.

我已经设法让这个过程开始了

emconfigure ./configure make

它开始成功开始生成LLVM bitcode .o文件,但随后它在main-gcu.c上挂起了'main-gcu.c:43:11:致命错误:'找不到'ncurses.h'文件'

我相信main-gcu.c是唯一引用ncurses的文件,但我无法弄清楚如何在编译时包含库.有没有办法用'make'指定包含ncurses,或者我应该用'emcc main-gcu.c -c -lncurses'单独编译main-gcu.c文件?我试过这样做但是导致了另一个错误,emcc无法找到其他实际包含的两个级别的头文件(它找不到main-gcu.c包含的头所包含的头文件 - 无论如何要解决这个问题? ).

我也不确定我是否需要在Mac OSX上安装ncurses库.我真正能找到的就是对Linux的libncurses5-dev的引用.

谢谢!

gcc makefile ncurses llvm emscripten

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

无法使用 Emscripten 编译 GMP lib

我已经使用最新版本的 Emscripten 尝试了此处的说明:https : //github.com/kripken/gmp.js/blob/master/README.markdown

.a 文件似乎已正确创建。然后我尝试针对该库进行编译(在调试模式下),这似乎有效:

emcc invocation:  /home/marcosscriven/sources/emscripten/emcc -O0 --closure 0 test.c .libs/libgmp.a -o complete.js 
(Emscripten: Running sanity checks)
emcc: compiling to bitcode
emcc: compiling source file:  test.c
emcc running: /usr/local/bin/clang -m32 -U__i386__ -U__x86_64__ -U__i386 -U__x86_64 -Ui386 -Ux86_64 -U__SSE__ -U__SSE2__ -U__MMX__ -UX87_DOUBLE_ROUNDING -UHAVE_GCC_ASM_FOR_X87 -DEMSCRIPTEN -U__STRICT_ANSI__ -U__CYGWIN__ -D__STDC__ -Xclang -triple=i386-pc-linux-gnu -D__IEEE_LITTLE_ENDIAN -fno-math-errno -fno-ms-compatibility -nostdinc -Xclang -nobuiltininc -Xclang -nostdsysteminc -Xclang -isystem/home/marcosscriven/sources/emscripten/system/local/include -Xclang -isystem/home/marcosscriven/sources/emscripten/system/include -Xclang -isystem/home/marcosscriven/sources/emscripten/system/include/emscripten -Xclang -isystem/home/marcosscriven/sources/emscripten/system/include/bsd -Xclang -isystem/home/marcosscriven/sources/emscripten/system/include/libc -Xclang -isystem/home/marcosscriven/sources/emscripten/system/include/libcxx -Xclang -isystem/home/marcosscriven/sources/emscripten/system/lib/libcxxabi/include -Xclang -isystem/home/marcosscriven/sources/emscripten/system/include/gfx -Xclang -isystem/home/marcosscriven/sources/emscripten/system/include/net …
Run Code Online (Sandbox Code Playgroud)

llvm gmp emscripten

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

建议使用简单的x86仿真器和操作系统

作为个人学习项目,我想将现有的x86模拟器库移植到JavaScript,然后在它上面运行一个非常简单的操作系统.

我对库的唯一要求是它应该用C\C++编写,因为我想使用emscripten和asm.js将源文件编译为JavaScript.该库至少应该能够解释x86操作码; JavaScript的特定环境细节(内存,GUI,中断等)我可以自己实现.操作系统没有任何要求,只要它足够简单并且可以在仿真器上运行.

到目前为止,在我的研究中,Softx86似乎是最可行的解决方案,因为它似乎很容易移植到JavaScript(它只进行CPU仿真).我能找到的最简单的16位实模式操作系统是MikeOS,唯一的问题是它需要386处理器,Softx86无法模拟,我不确定它们是否完全兼容.

我的问题是,如果有人知道模拟器操作系统的另一种组合,它很简单,可以移植到JavaScript.

x86 operating-system emulation i386 emscripten

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

如何在 Emscripten 中以 void 作为返回值包装或调用 C 函数?

在 Emscripten wiki(与代码交互)中,只有两种类型被列为要传递给ccallor 的可能返回类型cwrap(“数字”和“字符串”)。如何包装/调用一个不返回任何内容的函数(void 返回类型)?

emscripten

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

使用Emscripten调用函数指针

使用Emscripten,是否可以从JavaScript调用函数指针(因此,一个数字)?
函数的签名是可变的,所以我不能编写帮助程序并完成.

为了举例说明,我有一个这样的函数:

// Returns a function pointer to call, with the appropiate
// arguments, to initialize the demanded feature.
void* get_feature_activator(feature_t feat);
Run Code Online (Sandbox Code Playgroud)

您应该按如下方式使用它:

// Initialize the speaker
void* activator = get_feature_activator(FEATURE_SPEAKER);
// We know this function needs one float, so we cast and call it
((void(*)(float))activator) (3.0);
Run Code Online (Sandbox Code Playgroud)

要对JavaScript执行相同的操作:

var activator = _get_feature_activator(constants.FEATURE_SPEAKER);
// TODO: Need to call this pointer with one float
Run Code Online (Sandbox Code Playgroud)

javascript emscripten

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

“emcc”命令无法识别

我在构建这个演示时遇到了问题。 https://github.com/kakukogou/opencvjs_demo_segmentation

当我 cd 进入此文件夹并运行 make 命令时,我收到此错误消息:

/bin/sh: 1: emcc: not found  
make: *** [segmentation] Error 127
Run Code Online (Sandbox Code Playgroud)

这就是 make 文件的样子。

segmentation: ../src/segmentation.cpp ../src/export.cpp  
    mkdir -p $(OBJDIR)  
    emcc \  
    ../src/segmentation.cpp \  
    ../src/export.cpp \  
    -I $(OPENCV_INSTALL_DIR)/include \  
    $(OPENCV_INSTALL_DIR)/lib/libopencv_core.so \   
    $(OPENCV_INSTALL_DIR)/lib/libopencv_imgproc.so \  
    -s EXPORTED_FUNCTIONS="['_on_mouse', '_on_init', '_on_process']" \  
    -O3 \  
    --llvm-lto 1 \  
    --closure 1 \  
    -s PRECISE_F32=1 \  
    -s FORCE_ALIGNED_MEMORY=1 \  
    -s TOTAL_MEMORY=306777216 \  
    -o ./bin/segmentation.js  

clean:  
    rm ./bin/*.js ./bin/*.mem  
Run Code Online (Sandbox Code Playgroud)

我的环境变量有问题吗?编译这个的正确方法是什么?

javascript opencv emscripten asm.js

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

Emscripten的CMake项目

我想制作CMake和Emscripten的朋友.没有在Emscripten项目网站上找到更多或更少信息的文档,但他们提供了CMake工具链文件,所以我认为它应该是可能的.到目前为止,没有高级参数的基本编译工作正常,但我在使用embind和预加载文件时遇到了问题.

  1. 链接过程似乎错过了Emscripten"二进制文件",并为所有与embind相关的函数生成警告,如下所示:warning: unresolved symbol: _embind_register_class在rowser中加载编译的JS文件时会导致相应的错误.
  2. .data编译期间不生成任何文件.

我创建了一个简约的示例,其中包括两个目标:一个"普通"(客户端)和一个手动(手动客户端),它只是运行emcc,因为我希望它运行:https://github.com/xwaffelx/minimal -cmake-emscripten项目/ BLOB /主/ README.md

虽然手动方式有效,但我认为这不是一种正确的方法......

---更新---

根据要求,这里有更简短的例子:

  1. CMakeLists.txt文件
    cmake_minimum_required(VERSION 2.8)
    cmake_policy(SET CMP0015 NEW)
    project(emtest)
    set(CMAKE_VERBOSE_MAKEFILE on)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/build.emscripten)
    include_directories("lib/assimp/include")
    link_directories("lib/assimp/lib-js")
    link_libraries("assimp")
    file(GLOB_RECURSE CORE_HDR src/.h)
    file(GLOB_RECURSE CORE_SRC src/.cpp)
    add_definitions("-s DEMANGLE_SUPPORT=1 --preload-file ${CMAKE_SOURCE_DIR}/assets --bind")
    add_executable(client ${CORE_SRC} ${CORE_HDR})
    

结果应该等同于手动运行以下命令:

emcc 
    -Ilib/assimp/include 
    -s DEMANGLE_SUPPORT=1
    --preload-file assets
    --bind
    Application.cpp 
    lib/assimp/lib-js/libassimp.so 
    -o client.js

这是Application.cpp:

#include "Application.h"

#include <iostream>

#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>

void Application::Initialize() {
    std::cout << …
Run Code Online (Sandbox Code Playgroud)

c++ cmake emscripten

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

用Emscripten编译GMP / MPFR

好吧,这让我发疯了。我已经尝试了至少一个月,但互联网上没有任何帮助。

我跟着步骤。当我执行这些步骤时,即使该示例也不起作用,因为当我执行此步骤时,我会明白这一点。

bitcode ==> javascript
warning: unresolved symbol: __gmpz_cmp
warning: unresolved symbol: __gmpz_mul_ui
warning: unresolved symbol: __gmpz_submul_ui
warning: unresolved symbol: __gmpz_init_set_ui
warning: unresolved symbol: __gmpz_mul_2exp
warning: unresolved symbol: __gmpz_init
warning: unresolved symbol: __gmpz_fdiv_qr
warning: unresolved symbol: __gmpz_add
Run Code Online (Sandbox Code Playgroud)

当我运行生成的complete.js文件时-

missing function: __gmpz_init
-1
-1

/home/ubuntu/workspace/gmp.js/complete.js:117
      throw ex;
      ^
abort(-1) at Error
    at jsStackTrace (/home/ubuntu/workspace/gmp.js/complete.js:1045:13)
    at stackTrace (/home/ubuntu/workspace/gmp.js/complete.js:1062:22)
    at abort (/home/ubuntu/workspace/gmp.js/complete.js:6743:44)
    at ___gmpz_init (/home/ubuntu/workspace/gmp.js/complete.js:1744:56)
    at Object._main (/home/ubuntu/workspace/gmp.js/complete.js:4978:2)
    at Object.callMain (/home/ubuntu/workspace/gmp.js/complete.js:6627:30)
    at doRun (/home/ubuntu/workspace/gmp.js/complete.js:6681:60)
    at run (/home/ubuntu/workspace/gmp.js/complete.js:6695:5)
    at Object.<anonymous> (/home/ubuntu/workspace/gmp.js/complete.js:6769:1)
    at …
Run Code Online (Sandbox Code Playgroud)

javascript mpfr gmp emscripten asm.js

4
推荐指数
2
解决办法
849
查看次数

Webassembly从wasm调用JavaScript方法,即使用c ++代码

我正在使用webassembly,到目前为止,我能够管理emscripten编译我的测试c ++项目到wasm文件em ++提供了我2个文件,即

mainTest.js mainTest.wasm

当我在我的html页面加载mainTest.js然后我得到一个名为" 模块 " 的Java脚本对象.

我确实找到了如何从javascript调用c ++/wasm方法,例如:

var myTestInteger = Module._callMyTestMethod();
Run Code Online (Sandbox Code Playgroud)

并从Module.wasmMemory.buffer读取字符串 ,但我不明白如何从c ++代码调用javascript.

即我希望能够像这样做:

#ifdef __cplusplus
extern "C" {
#endif
extern void testExternJSMethod();

int main() 
{
    cout << " Hello From my Test1 !" << endl;

    testExternJSMethod();
    return 0;
}
int EMSCRIPTEN_KEEPALIVE callMyTestMethod(){
    return 26;
}
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

我正在加载另一个名为utils.js的js文件中的my js方法testExternMethod

function testExternMethod() {
  console.log("Hello from testExternMethod!" + )
}
Run Code Online (Sandbox Code Playgroud)

在这里我想从c ++调用JavaScript testExternJSMethod.

当我在Firefox中运行页面时,在调试器控制台中获得"-1".

那么我在这种情况下缺少什么?不幸的是,Mozilla文档仅提供了那些S表达式而不是C++的示例.

我在例子中缺少什么?即在c ++中,我用extern关键字ie定义了方法

extern void testExternJSMethod();
Run Code Online (Sandbox Code Playgroud)

但我觉得这不是我必须做的全部.

我相信我应该以某种方式将该java脚本方法以某种方式链接到模块,但我不知道如何. …

javascript c++11 emscripten webassembly

4
推荐指数
2
解决办法
4602
查看次数

将 C 编译为 wasm,设置与 WasmFiddle 相同

查看以下WasmFiddle,一旦编译为 wasm 文件为 259 字节。我正在尝试从 WasmFiddle 移动到我的本地环境,所以我已经下载并安装了Emscripten编译器。

现在,由于 Emscripten 环境添加了额外的功能,因此相同的代码为 22KB。

问:如何在本地机器上编译 c 代码并保持精简?更好的是我怎样才能拥有与 WasmFiddle 相同的输出?

javascript emscripten webassembly

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