首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用emcc -O2编译基本代码时崩溃

用emcc -O2编译基本代码时崩溃
EN

Stack Overflow用户
提问于 2016-04-03 20:26:53
回答 2查看 479关注 0票数 0

我正在尝试用emcc -O2编译一些基本的测试代码,但由于我不理解的原因,编译在某一点上失败了:

代码语言:javascript
复制
D:\Projects\jsport>call emcc "../src/lib.cpp" -o emscripten_test-min.js -O2 -s EXPORTED_FUNCTIONS="['_testFct']" -s RESERVED_FUNCTION_POINTERS=1
WARNING:root:generating system asset: optimizer.exe...
Traceback (most recent call last):
  File "D:\Program Files\Emscripten\emscripten\1.35.0\\emcc", line 1602, in <module>
    flush_js_optimizer_queue()
  File "D:\Program Files\Emscripten\emscripten\1.35.0\\emcc", line 1505, in flush_js_optimizer_queue
    run_passes(chunks[0], title, just_split=False, just_concat=False)
  File "D:\Program Files\Emscripten\emscripten\1.35.0\\emcc", line 1478, in run_passes
    final = shared.Building.js_optimizer(final, passes, debug_level >= 4, js_optimizer_extra_info, just_split=just_split, just_concat=just_concat)
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\shared.py", line 1634, in js_optimizer
    ret = js_optimizer.run(filename, passes, NODE_JS, debug, extra_info, just_split, just_concat)
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\js_optimizer.py", line 538, in run
    return temp_files.run_and_clean(lambda: run_on_js(filename, passes, js_engine, source_map, extra_info, just_split, just_concat))
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\tempfiles.py", line 64, in run_and_clean
    return func()
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\js_optimizer.py", line 538, in <lambda>
    return temp_files.run_and_clean(lambda: run_on_js(filename, passes, js_engine, source_map, extra_info, just_split, just_concat))
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\js_optimizer.py", line 428, in run_on_js
    if not use_native(passes, source_map) or not get_native_optimizer():
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\js_optimizer.py", line 182, in get_native_optimizer
    return get_optimizer('optimizer.exe', [], ignore_build_errors)
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\js_optimizer.py", line 166, in get_optimizer
    return shared.Cache.get(name, create_optimizer_cmake, extension='exe')
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\cache.py", line 41, in get
    temp = creator()
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\js_optimizer.py", line 117, in create_optimizer_cmake
    proc = subprocess.Popen(['cmake', '-G', cmake_generator, '-DCMAKE_BUILD_TYPE='+cmake_build_type, shared.path_from_root('tools', 'optimizer')], cwd=build_path, stdin=log_output, stdout=log_output, stderr=log_output)
  File "D:\Program Files\Emscripten\python\2.7.5.3_64bit\lib\subprocess.py", line 711, in __init__
    errread, errwrite)
  File "D:\Program Files\Emscripten\python\2.7.5.3_64bit\lib\subprocess.py", line 948, in _execute_child
    startupinfo)

如果删除O2选项,那么完全相同的代码会编译得很好,可以从Javascript调用。

知道怎么解决这个问题吗?

我正在试图编译的代码:

Lib.h:

代码语言:javascript
复制
#ifndef LIB_H
#define LIB_H

extern "C" {

typedef void (*invoke_oncomplete_callback_t)(int, const char*, const char*);

void testFct(const void *arr_data_rgba, int arr_width, int arr_height, int job_id, invoke_oncomplete_callback_t callback);

}

#endif //LIB_H

Lib.cpp:

代码语言:javascript
复制
#include <sstream>
#include "lib.h"

// Internal C++ library functions 
namespace impl {

void testFct(const void *arr_data, int arr_width, int arr_height, int job_id, invoke_oncomplete_callback_t callback)
{
    // Call the callback with the result
    std::stringstream ss;
    ss << "Inversion done in " << 0 << "s";
    callback(job_id, "", ss.str().c_str());
}

}   // namespace impl

// Exposed C library function 
void testFct(const void *arr_data, int arr_width, int arr_height, int job_id, invoke_oncomplete_callback_t callback)
{
    impl::testFct(arr_data, arr_width, arr_height, job_id, callback);
}

使用EMCC_DEBUG=1的输出:

代码语言:javascript
复制
D:\Projects\jsport>set EMCC_DEBUG=1
D:\Projects\jsport>call emcc "../src/lib.cpp" -o emscripten_test-min.js -O2 -s EXPORTED_FUNCTIONS="['_testFct']" -s RESERVED_FUNCTION_POINTERS=1
DEBUG:root:PYTHON not defined in C:\Users\MyUserName/.emscripten, using "D:\Program Files\Emscripten\python\2.7.5.3_64bit\python.exe"
WARNING:root:invocation: D:\Program Files\Emscripten\emscripten\1.35.0\\emcc ../src/lib.cpp -o emscripten_test-min.js -O2 -s EXPORTED_FUNCTIONS=['_testFct'] -s RESERVED_FUNCTION_POINTERS=1  (in D:\Projects\jsport)
INFO:root:(Emscripten: Running sanity checks)
DEBUG:root:compiling to bitcode
DEBUG:root:emcc step "parse arguments and setup" took 0.00 seconds
DEBUG:root:compiling source file: ../src/lib.cpp
DEBUG:root:running: D:\Program Files\Emscripten\clang\e1.35.0_64bit\clang++ -target asmjs-unknown-emscripten -D__EMSCRIPTEN_major__=1 -D__EMSCRIPTEN_minor__=35 -D__EMSCRIPTEN_tiny__=0 -Werror=implicit-function-declaration -nostdinc -Xclang -nobuiltininc -Xclang -nostdsysteminc -Xclang -isystemD:\Program Files\Emscripten\emscripten\1.35.0\system\local\include -Xclang -isystemD:\Program Files\Emscripten\emscripten\1.35.0\system\include\compat -Xclang -isystemD:\Program Files\Emscripten\emscripten\1.35.0\system\include -Xclang -isystemD:\Program Files\Emscripten\emscripten\1.35.0\system\include\emscripten -Xclang -isystemD:\Program Files\Emscripten\emscripten\1.35.0\system\include\libc -Xclang -isystemD:\Program Files\Emscripten\emscripten\1.35.0\system\lib\libc\musl\arch\emscripten -Xclang -isystemD:\Program Files\Emscripten\emscripten\1.35.0\system\include\libcxx -O2 -mllvm -disable-llvm-optzns -std=c++03 ../src/lib.cpp -Xclang -isystemD:\Program Files\Emscripten\emscripten\1.35.0\system\include\SDL -emit-llvm -c -o C:\Users\MyUserName\AppData\Local\Temp\tmppmxhg5\lib_0.o
DEBUG:root:emcc step "bitcodeize inputs" took 0.61 seconds
DEBUG:root:optimizing ../src/lib.cpp
DEBUG:root:emcc: LLVM opts: -O3 -disable-loop-vectorization -disable-slp-vectorization -vectorize-loops=false -vectorize-slp=false -vectorize-slp-aggressive=false  [num inputs: 1]
DEBUG:root:emcc step "process inputs" took 0.12 seconds
DEBUG:root:will generate JavaScript
DEBUG:root:including libcxx_noexcept.a
DEBUG:root:including libcxxabi.bc
DEBUG:root:including libc.bc
DEBUG:root:including dlmalloc.bc
DEBUG:root:emcc step "calculate system libraries" took 0.05 seconds
DEBUG:root:linking: ['C:\\Users\\MyUserName\\AppData\\Local\\Temp\\tmppmxhg5\\lib_0_1.o', 'C:\\Users\\MyUserName\\.emscripten_cache\\libcxxabi.bc', 'C:\\Users\\MyUserName\\.emscripten_cache\\libc.bc', 'C:\\Users\\MyUserName\\.emscripten_cache\\dlmalloc.bc', 'C:\\Users\\MyUserName\\.emscripten_cache\\libcxx_noexcept.a']
DEBUG:root:adding object C:\Users\MyUserName\AppData\Local\Temp\tmppmxhg5\lib_0_1.o to link
DEBUG:root:adding object C:\Users\MyUserName\.emscripten_cache\libcxxabi.bc to link
DEBUG:root:adding object C:\Users\MyUserName\.emscripten_cache\libc.bc to link
DEBUG:root:adding object C:\Users\MyUserName\.emscripten_cache\dlmalloc.bc to link
DEBUG:root:considering archive C:\Users\MyUserName\.emscripten_cache\libcxx_noexcept.a
DEBUG:root:adding object C:\Users\MyUserName\AppData\Local\Temp\emscripten_temp\tmprfwi8k\string_fb1646b4.cpp.o to link
DEBUG:root:adding object C:\Users\MyUserName\AppData\Local\Temp\emscripten_temp\tmprfwi8k\ios_1da97a69.cpp.o to link
DEBUG:root:adding object C:\Users\MyUserName\AppData\Local\Temp\emscripten_temp\tmprfwi8k\locale_528bea5a.cpp.o to link
DEBUG:root:adding object C:\Users\MyUserName\AppData\Local\Temp\emscripten_temp\tmprfwi8k\memory_8c4a4594.cpp.o to link
DEBUG:root:adding object C:\Users\MyUserName\AppData\Local\Temp\emscripten_temp\tmprfwi8k\system_error_7d190770.cpp.o to link
DEBUG:root:adding object C:\Users\MyUserName\AppData\Local\Temp\emscripten_temp\tmprfwi8k\mutex_50c49967.cpp.o to link
DEBUG:root:adding object C:\Users\MyUserName\AppData\Local\Temp\emscripten_temp\tmprfwi8k\condition_variable_1b9bbc16.cpp.o to link
DEBUG:root:adding object C:\Users\MyUserName\AppData\Local\Temp\emscripten_temp\tmprfwi8k\stdexcept_e242ef16.cpp.o to link
DEBUG:root:adding object C:\Users\MyUserName\AppData\Local\Temp\emscripten_temp\tmprfwi8k\thread_b13652bb.cpp.o to link
DEBUG:root:adding object C:\Users\MyUserName\AppData\Local\Temp\emscripten_temp\tmprfwi8k\future_fce87bc4.cpp.o to link
DEBUG:root:adding object C:\Users\MyUserName\AppData\Local\Temp\emscripten_temp\tmprfwi8k\exception_f3e64688.cpp.o to link
DEBUG:root:done running loop of archive C:\Users\MyUserName\.emscripten_cache\libcxx_noexcept.a
DEBUG:root:emcc step "link" took 0.81 seconds
DEBUG:root:saving intermediate processing steps to C:\Users\MyUserName\AppData\Local\Temp\emscripten_temp
DEBUG:root:(not saving intermediate C:\Users\MyUserName\AppData\Local\Temp\emscripten_temp\emcc-0-basebc.bc because deferring linking)
DEBUG:root:emcc: LLVM opts: -strip-debug -disable-verify -internalize -internalize-public-api-list=testFct,malloc,free,__errno_location,fflush,__cxa_can_catch,__cxa_is_pointer_type -globaldce -pnacl-abi-simplify-preopt -pnacl-abi-simplify-postopt -disable-loop-vectorization -disable-slp-vectorization -vectorize-loops=false -vectorize-slp=false -vectorize-slp-aggressive=false  [num inputs: 15]
DEBUG:root:emcc step "post-link" took 0.37 seconds
DEBUG:root:LLVM => JS
DEBUG:root:emscript: llvm backend: D:\Program Files\Emscripten\clang\e1.35.0_64bit\llc C:\Users\MyUserName\AppData\Local\Temp\tmppmxhg5\emscripten_test-min.bc -march=js -filetype=asm -o C:\Users\MyUserName\AppData\Local\Temp\emscripten_temp\tmp1zqxhc.4.js -emscripten-reserved-function-pointers=1 -O2
DEBUG:root:  emscript: llvm backend took 0.236999988556 seconds
DEBUG:root:emscript: js compiler glue
DEBUG:root:  emscript: glue took 0.319000005722 seconds
DEBUG:root:asm text sizes[[1463028, 17491], 5292, 200, 3702, 0, 5207, 23191, 1086, 268, 2736, 2080]
DEBUG:root:  emscript: final python processing took 0.00999999046326 seconds
DEBUG:root:emcc step "emscript (llvm=>js)" took 0.60 seconds
DEBUG:root:wrote memory initialization to emscripten_test-min.js.mem
DEBUG:root:emcc step "source transforms" took 0.05 seconds
DEBUG:root:running js post-opts
DEBUG:root:applying js optimization passes: asm eliminate simplifyExpressions simplifyIfs registerize minifyNames asmLastOpts last minifyWhitespace cleanup
chunkification: num funcs: 707 actual num chunks: 3 chunk size range: 522935 - 450885
WARNING:root:generating system asset: optimizer.exe...
DEBUG:root:building native optimizer via CMake: optimizer.exe
Traceback (most recent call last):
  File "D:\Program Files\Emscripten\emscripten\1.35.0\\emcc", line 1602, in <module>
    flush_js_optimizer_queue()
  File "D:\Program Files\Emscripten\emscripten\1.35.0\\emcc", line 1505, in flush_js_optimizer_queue
    run_passes(chunks[0], title, just_split=False, just_concat=False)
  File "D:\Program Files\Emscripten\emscripten\1.35.0\\emcc", line 1478, in run_passes
    final = shared.Building.js_optimizer(final, passes, debug_level >= 4, js_optimizer_extra_info, just_split=just_split, just_concat=just_concat)
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\shared.py", line 1634, in js_optimizer
    ret = js_optimizer.run(filename, passes, NODE_JS, debug, extra_info, just_split, just_concat)
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\js_optimizer.py", line 538, in run
    return temp_files.run_and_clean(lambda: run_on_js(filename, passes, js_engine, source_map, extra_info, just_split, just_concat))
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\tempfiles.py", line 64, in run_and_clean
    return func()
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\js_optimizer.py", line 538, in <lambda>
    return temp_files.run_and_clean(lambda: run_on_js(filename, passes, js_engine, source_map, extra_info, just_split, just_concat))
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\js_optimizer.py", line 428, in run_on_js
    if not use_native(passes, source_map) or not get_native_optimizer():
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\js_optimizer.py", line 182, in get_native_optimizer
    return get_optimizer('optimizer.exe', [], ignore_build_errors)
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\js_optimizer.py", line 166, in get_optimizer
    return shared.Cache.get(name, create_optimizer_cmake, extension='exe')
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\cache.py", line 41, in get
    temp = creator()
  File "D:\Program Files\Emscripten\emscripten\1.35.0\tools\js_optimizer.py", line 117, in create_optimizer_cmake
    proc = subprocess.Popen(['cmake', '-G', cmake_generator, '-DCMAKE_BUILD_TYPE='+cmake_build_type, shared.path_from_root('tools', 'optimizer')], cwd=build_path, stdin=log_output, stdout=log_output, stderr=log_output)
  File "D:\Program Files\Emscripten\python\2.7.5.3_64bit\lib\subprocess.py", line 711, in __init__
    errread, errwrite)
  File "D:\Program Files\Emscripten\python\2.7.5.3_64bit\lib\subprocess.py", line 948, in _execute_child
    startupinfo)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-07 19:02:21

正如这个职位中所述,在搜索本地编译器时,崩溃似乎是由于一个问题造成的。

设置环境变量EMCC_NATIVE_OPTIMIZER =0可以解决这个问题,降低编译速度。

票数 1
EN

Stack Overflow用户

发布于 2019-06-04 10:16:19

查看js_optimizer.py optimizer.py第108行)文件,我注意到它不支持VisualStudio2019 CMake生成器。将代码从

代码语言:javascript
复制
  if WINDOWS:
    # Poor man's check for whether or not we should attempt 64 bit build
    if os.environ.get('ProgramFiles(x86)'):
      cmake_generators = [
        'Visual Studio 15 2017 Win64',
        'Visual Studio 15 2017',
        'Visual Studio 14 2015 Win64',
        'Visual Studio 14 2015',
        'Visual Studio 12 Win64', # The year component is omitted for compatibility with older CMake.
        'Visual Studio 12',
        'Visual Studio 11 Win64',
        'Visual Studio 11',
        'MinGW Makefiles',
        'Unix Makefiles',
      ]
    else:
      cmake_generators = [
        'Visual Studio 15 2017',
        'Visual Studio 14 2015',
        'Visual Studio 12',
        'Visual Studio 11',
        'MinGW Makefiles',
        'Unix Makefiles',
      ]
  else:
    cmake_generators = ['Unix Makefiles']

至:

代码语言:javascript
复制
      if WINDOWS:
    # Poor man's check for whether or not we should attempt 64 bit build
    if os.environ.get('ProgramFiles(x86)'):
      cmake_generators = [
        "Visual Studio 16 2019 Win64",
        "Visual Studio 16 2019",
        'Visual Studio 15 2017 Win64',
        'Visual Studio 15 2017',
        'Visual Studio 14 2015 Win64',
        'Visual Studio 14 2015',
        'Visual Studio 12 Win64', # The year component is omitted for compatibility with older CMake.
        'Visual Studio 12',
        'Visual Studio 11 Win64',
        'Visual Studio 11',
        'MinGW Makefiles',
        'Unix Makefiles',
      ]
    else:
      cmake_generators = [
        "Visual Studio 16 2019",
        'Visual Studio 15 2017',
        'Visual Studio 14 2015',
        'Visual Studio 12',
        'Visual Studio 11',
        'MinGW Makefiles',
        'Unix Makefiles',
      ]
  else:
    cmake_generators = ['Unix Makefiles']

帮我解决了这个问题。

下面是一些额外信息的链接:

有关Visual支持的cmake发电机的列表

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

https://stackoverflow.com/questions/36390751

复制
相关文章

相似问题

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