我正在尝试使用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的引用.
谢谢!
我已经使用最新版本的 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) 作为个人学习项目,我想将现有的x86模拟器库移植到JavaScript,然后在它上面运行一个非常简单的操作系统.
我对库的唯一要求是它应该用C\C++编写,因为我想使用emscripten和asm.js将源文件编译为JavaScript.该库至少应该能够解释x86操作码; JavaScript的特定环境细节(内存,GUI,中断等)我可以自己实现.操作系统没有任何要求,只要它足够简单并且可以在仿真器上运行.
到目前为止,在我的研究中,Softx86似乎是最可行的解决方案,因为它似乎很容易移植到JavaScript(它只进行CPU仿真).我能找到的最简单的16位实模式操作系统是MikeOS,唯一的问题是它需要386处理器,Softx86无法模拟,我不确定它们是否完全兼容.
我的问题是,如果有人知道模拟器操作系统的另一种组合,它很简单,可以移植到JavaScript.
在 Emscripten wiki(与代码交互)中,只有两种类型被列为要传递给ccallor 的可能返回类型cwrap(“数字”和“字符串”)。如何包装/调用一个不返回任何内容的函数(void 返回类型)?
使用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) 我在构建这个演示时遇到了问题。 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)
我的环境变量有问题吗?编译这个的正确方法是什么?
我想制作CMake和Emscripten的朋友.没有在Emscripten项目网站上找到更多或更少信息的文档,但他们提供了CMake工具链文件,所以我认为它应该是可能的.到目前为止,没有高级参数的基本编译工作正常,但我在使用embind和预加载文件时遇到了问题.
warning: unresolved symbol: _embind_register_class在rowser中加载编译的JS文件时会导致相应的错误..data编译期间不生成任何文件.我创建了一个简约的示例,其中包括两个目标:一个"普通"(客户端)和一个手动(手动客户端),它只是运行emcc,因为我希望它运行:https://github.com/xwaffelx/minimal -cmake-emscripten项目/ BLOB /主/ README.md
虽然手动方式有效,但我认为这不是一种正确的方法......
---更新---
根据要求,这里有更简短的例子:
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) 好吧,这让我发疯了。我已经尝试了至少一个月,但互联网上没有任何帮助。
我跟着步骤此。当我执行这些步骤时,即使该示例也不起作用,因为当我执行此步骤时,我会明白这一点。
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) 我正在使用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脚本方法以某种方式链接到模块,但我不知道如何. …
查看以下WasmFiddle,一旦编译为 wasm 文件为 259 字节。我正在尝试从 WasmFiddle 移动到我的本地环境,所以我已经下载并安装了Emscripten编译器。
现在,由于 Emscripten 环境添加了额外的功能,因此相同的代码为 22KB。
问:如何在本地机器上编译 c 代码并保持精简?更好的是我怎样才能拥有与 WasmFiddle 相同的输出?