首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Emscripten: emmake生成.js文件

Emscripten: emmake生成.js文件
EN

Stack Overflow用户
提问于 2015-07-22 15:41:38
回答 1查看 2.6K关注 0票数 13

根据Emscripten Docs

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

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

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

emcmake cmake完成ok,然后emmake make工作,但我没有选择尝试各种优化或emcc通常会提供的任何选项。

我在Win 8下的vbox中尝试在Lubuntu15.04上编译,这是我的第一个除了教程之外的emscripten项目。我也不太熟悉c或c++或一般的编译(虽然我可以将这个项目编译成没有问题的Linux应用程序)。

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

EN

回答 1

Stack Overflow用户

发布于 2020-06-26 05:37:29

我不确定emcmake或emmake的使用情况,但我处理了一个基于CMAKE的C++项目,该项目是一个主要的可执行文件,用于在linux上编译为x86_64可执行文件,并将其转换为emscriptem以便将其部署到Nginx服务器上。

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

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

在这里,您正试图从主机 linux x86GCC交叉编译C/C++库或可执行文件,例如,也可以是WindowsE 29+E 110VisualE 211E 112C++编译器。

工具链文件

您需要一个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链接器标志:选择本机JS或WebAssembly输出

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

代码语言:javascript
复制
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'

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

定制Cmakelist.txt

在这个特定的项目中,重用我前面给出的示例CMakeLists.txt并定制它:

  • 使用emscriptem目标上的链接标志设置上面提到的emscriptem目标
代码语言:javascript
复制
set_target_properties(... PROPERTIES LINK_FLAGS "--emrun -s <emscript em link flags as described above>)
  • 根据项目的源语言配置发布版本生成C和或C++的版本生成编译器标志,C标志示例如下:
代码语言:javascript
复制
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的工具链文件,摘自上面的gist:
代码语言:javascript
复制
cmake -DCMAKE_BUILD_TYPE:string="Release" -DCMAKE_TOOLCHAIN_FILE=Toolchain-Emscripten.cmake src/"

将src/替换为源目录。

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

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

希望这能有所帮助!

罗曼

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31567870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档