javascript之Emscripten: emmake 生成 .js 文件

zengkefu 阅读:16 2024-11-24 20:56:43 评论:0

根据Emscripten Docs

Make generates linked LLVM bitcode. It does not automatically generate JavaScript during linking because all the files must be compiled using the same optimizations and compiler options — and it makes sense to do this in the final conversion from bitcode to JavaScript.



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

我需要更改什么才能使用 emmake 生成正确的字节码命令而不是 .js 文件?
emcmake cmake完成 ok 然后 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++ 程序。
在这里,您尝试从 交叉编译 C/C++ 库或可执行文件。主持人 linux x86 海合会 例如,也可以是 window + 视觉 C++ 编译器。
工具链文件
您需要一个 CMAKE工具链文件这将告诉 CMAKE 如何使用 emscriptem 工具,包括 emscriptem 编译器和生成 JS 或 WebAssembly 的链接器。

  • 在此处获取 Emscriptem cmake 工具链文件示例 linux GCC x86:
    https://gist.github.com/romatou18/9f631147b5b26f980ab9669c375a6e3f

  • 编译器标志
  • 使用 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 或 WebAssembly 作为输出JS_ONLY 选项:
    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 AND OR C++ 配置发布版本编译器标志,cflags示例如下:
  • 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 项目上运行它,但我认为这应该让你走上正轨。对此进行迭代,直到它起作用。我有一个工作库和执行程序正是使用这个,不再;-)
    同样,这是一个基于 CMAKE 的项目,它看起来设计精美并且看起来模块化,因此我会坚持使用 CMAKE + 交叉编译工具链文件并将 make/emmake 的细节留给...... CMAKE,除非你真的别无选择。
    希望这可以帮助!
    罗曼


    标签:JavaScript
    声明

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    关注我们

    一个IT知识分享的公众号