Emscripten:emmake生成.js文件

Jos*_*iah 11 javascript c++ emscripten

根据Emscripten Docs

Make生成链接的LLVM bitcode.它不会在链接期间自动生成JavaScript,因为所有文件都必须使用相同的优化和编译器选项进行编译 - 并且在从bitcode到JavaScript的最终转换中执行此操作是有意义的.

这很棒,我想做什么.但是,运行Emscripten来编译openjpeg .jp2库会-O0在5-6mb范围内生成4个未压缩的(.).js文件,以及514kb的三个相同的字节码.so文件,这些文件似乎不包含我需要的代码.当我运行它们时,emcc它们以141kb的形式出现,没有_main函数或任何可识别的东西,并且与其他.js文件的行为不同.

我需要更改以使用emmake命令而不是.js文件生成正确的字节码?

emcmake cmake完成确定然后emmake make工作,但我没有选择尝试各种优化或任何emcc通常会给出的选项.

我正在Win 8下的vbox中尝试在Lubuntu 15.04上进行编译.这是我的第一个emscripten项目,而不是教程.我也不太熟悉c或c ++或编译(尽管我可以将这个项目编译成Linux应用程序而没有任何问题).

我知道j2k.js,但我正在寻找obj_compress,而不是obj_decompress.

rsa*_*ini 1

我不确定 emcmake 或 emmake 的使用直接,但工作于一个基于 CMAKE 的 C++ 项目,一个主要的可执行文件,用于在 Linux 上编译为 x86_64 可执行文件,并且我将其转换为 emscriptem 以便将其部署在 Nginx 上服务器。

CMAKE交叉编译+目标平台和输出=工具链文件+链接器标志+编译器标志

openjpeg.jp2 项目是一个 CMAKE C/C++ 程序。

在这里,您尝试从主机 Linux x86GCC交叉编译 C/C++ lib 或可执行文件,也可以是Windows + Visual C++ 编译器。

工具链文件

您需要一个CMAKE 工具链文件,它会告诉 CMAKE 如何使用 emscriptem 工具,包括 emscriptem 编译器和生成 JS 或 WebAssembly 的链接器。

编译器标志

  • 使用 CMAKE 项目时,请参阅 CMakeLists.txt 文件,以便根据所选的调试/发布构建类型(即 openjpeg.jp2 项目的 GCC 构建标志)查找/应用/修改编译器和链接器标志:

编译器标志示例: https://github.com/uclouvain/openjpeg/blob/172c8ae5cf230ff74b5814daf29e5b577aa30a9b/CMakeLists.txt#L200

同样,我不知道 emmake/emcmake 的具体细节,但如果您的项目是基于 CMAKE 的,工具链文件应该告诉 CMAKE 编译程序所需的所有信息。

Emscriptem 链接器标志:选择 Native JS 或 WebAssembly 输出

CMakelists.txt 指定 emscriptem 链接器标志并根据JS_ONLY选项选择 JS 或 WebAssembly 作为输出:

cmake_minimum_required(VERSION 3.6)
message( "Current dir: ${CMAKE_CURRENT_LIST_DIR}" )

#make sure it is all static
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
SET(BUILD_SHARED_LIBRARIES OFF)

option(JS_ONLY "Compiles to native JS (No WASM)" OFF)

add_executable( myProgram main.cpp)
target_link_libraries( myProgram ${API_LIB})
target_compile_features(myProgram PRIVATE cxx_std_14)


if(JS_ONLY)
  message(STATUS "Setting compilation target to native JavaScript")
  set(CMAKE_EXECUTABLE_SUFFIX ".js")
  set_target_properties(myProgram PROPERTIES LINK_FLAGS "--emrun -s EXPORTED_FUNCTIONS='[_main]'")
else(JS_ONLY)
  message(STATUS "Setting compilation target to WASM")
  set(CMAKE_EXECUTABLE_SUFFIX ".wasm.js")
  set_target_properties(myProgram PROPERTIES LINK_FLAGS "--emrun -s WASM=1 -s BINARYEN_METHOD='native-wasm' -s EXPORTED_FUNCTIONS='[_main]' -s NO_EXIT_RUNTIME=1 -s EXTRA_EXPORTED_RUNTIME_METHODS=['ccall']")
endif(JS_ONLY)

#- Compiling to emscriptem/js output: PROPERTIES LINK_FLAGS set to --emrun -s 

#- Compiling to emscriptem/WASM => webAssembly output: PROPERTIES LINK_FLAGS set to --emrun -s WASM=1 -s BINARYEN_METHOD='native-wasm'


Run Code Online (Sandbox Code Playgroud)

注意 WebAssembly 是 EmscriptEm 获得的最低输出级别,理论上应该比 JS 更紧凑。

自定义 Cmakelist.txt

在这个特定的项目中,重用我上面给出的示例 CMakeLists.txt 并对其进行自定义:

  • 像上面提到的那样,使用 emscriptem 目标上的链接标志设置您的 emscriptem 目标
set_target_properties(... PROPERTIES LINK_FLAGS "--emrun -s <emscript em link flags as described above>)
Run Code Online (Sandbox Code Playgroud)
  • 根据项目的源语言,为发布版本 C 和或 C++ 配置发布版本编译器标志,C 标志示例如下:
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb -Wall -Wunused-variable -Wno-unused-parameter -fno-inline ... etc ...etc ...")
set(CMAKE_C_FLAGS_RELEASE "-O2 -Wno-format-security -Wno-format-nonliteral -Wall -Wunused-variable -Wno-unused-parameter")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} [+ optional extra flags for both here...]"
Run Code Online (Sandbox Code Playgroud)

运行cmake配置

现在是使用工具链文件的时候了:

  • 使用所需的构建类型运行 cmake 并指定告诉 CMAKE 如何使用 emscriptem 的工具链文件,取自上面的要点:
cmake -DCMAKE_BUILD_TYPE:string="Release" -DCMAKE_TOOLCHAIN_FILE=Toolchain-Emscripten.cmake src/"
Run Code Online (Sandbox Code Playgroud)

将 src/ 替换为源目录。

我还没有尝试在 openjpeg 项目上运行它,但我认为这应该让你走上正确的轨道。迭代这个直到它起作用。我有一个工作库和执行程序正是使用这个,不再有;-)

同样,这是一个基于 CMAKE 的项目,它看起来设计得很好,看起来很模块化,因此我会坚持使用 CMAKE + 交叉编译工具链文件,并将 make/emmake 的详细信息留给... CMAKE,除非你真的别无选择。

希望这可以帮助!

罗曼