繁体   English   中英

Emscripten:emmake 生成 .js 文件

[英]Emscripten: emmake generating .js files

根据Emscripten Docs

Make 生成链接的 LLVM 位码。 它不会在链接期间自动生成 JavaScript,因为所有文件都必须使用相同的优化和编译器选项进行编译——在从 bitcode 到 JavaScript 的最终转换中这样做是有意义的。

这是伟大的,我想做什么。 但是,运行 Emscripten 来编译openjpeg .jp2 库会生成 4 个 5-6mb 范围内的未压缩 ( -O0 ) .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。

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

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

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

在这里,您尝试使用GCC主机linux x86交叉编译 C/C++ 库或可执行文件,例如,也可以是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'


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

自定义 Cmakelist.txt

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

  • 使用 emscriptem 目标上的链接标志设置您的 emscriptem 目标,如上所述
set_target_properties(... PROPERTIES LINK_FLAGS "--emrun -s <emscript em link flags as described above>)
  • 根据项目的源语言,为发布构建 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...]"

运行 cmake 配置

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

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

将 src/ 替换为源目录。

我还没有尝试在 openjpeg 项目上运行它,但我认为这应该让你走上正轨。 迭代这个直到它工作。 我有一个可用的 lib 和 exec 正是使用这个,没有更多 ;-)

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

希望这可以帮助!

罗曼

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM