gpt4 book ai didi

javascript - Emscripten: emmake 生成 .js 文件

转载 作者:行者123 更新时间:2023-12-01 11:56:08 27 4
gpt4 key购买 nike

根据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 - Emscripten: emmake 生成 .js 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31567870/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com