Emscripten Link静态库错误:wasm进行蒸汽编译失败:导入'env.getTempRet0'

时间:2019-03-19 04:11:47

标签: c++ linker emscripten webassembly

当我尝试将wasm代码与静态库Grassroot DICOM库链接时出现错误。

首先,我使用带有外部工具链的cmake编译Grassroot DICOM,并从 /1.38.14/cmake/Modules/Platform

将Windows 10与Visual Studio 2017和Windows 8.1 SDK结合使用。

编译完成后。我有静态链接文件

libgdcmcharls.a
libgdcmCommon.a
libgdcmDICT.a
libgdcmDSED.a
....

然后我使用标志将这些文件链接到我的代码

-L<PATH-to-library>
-lgdcmcharls -lgdcmCommon -lgdcmDICT -lgdcmDSED ...

还使用:

-s WASM=1 -s SIDE_MODULE=1 -s EXPORT_ALL=1 

库可以链接,不能编译。错误是

  

multiprocessing.pool.RemoteTraceback:“”“追溯(最近一次调用   最后):文件   “ C:\ Users \ WORK \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ multiprocessing \ pool.py”,   第121行,在工作程序中       结果=(True,func(* args,** kwds))文件“ C:\ Users \ I-w-I \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ multiprocessing \ pool.py”,   地图星号第44行       返回列表(map(* args))文件“ C:\ workspace \ emsdk \ emscripten \ 1.38.14 \ tools \ shared.py”,行1363,在   extract_archive_contents       断言不是os.path.dirname(f)AssertionError。

然后,我更改了使用链接到Grassroot DICOM的方式

-s RUNTIME_LINKED_LIBS=['gdcmcharls.a']
-s RUNTIME_LINKED_LIBS=['gdcmCommon.a']
-s RUNTIME_LINKED_LIBS=['gdcmDICT.a']
-s RUNTIME_LINKED_LIBS=['gdcmDSED.a']
.....

我收到错误消息

  

wasm流式编译失败:LinkError:导入'env.getTempRet0'为   无效。预期类型功能

     

回到ArrayBuffer实例

并在控制台中显示此错误

  

LinkError:导入'env.getTempRet0'无效。预期类型功能

关于我的机器。我使用Windows10 64位 emcc(Emscripten gcc / clang-like替换)1.38.14 我在网上闲逛,但似乎没人遇到与我相同的问题

更新

现在我删除了所有动态链接标志,并且出现了新问题

emcc -std=c++17 -O3 --no-heap-copy -s WASM=1  -s USE_WEBGL2=1 -s FULL_ES3=1 -s ALLOW_MEMORY_GROWTH=1 -o hello.html  -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall', 'cwrap']"        libgdcmcharls.bc libgdcmCommon.bc libgdcmDICT.bc libgdcmDSED.bc libgdcmexpat.bc libgdcmIOD.bc libgdcmjpeg12.bc libgdcmjpeg16.bc libgdcmjpeg8.bc libgdcmMEXD.bc libgdcmMSFF.bc libgdcmopenjp2.bc libgdcmzlib.bc libsocketxx.bc main.cpp  -o hello.js
  

multiprocessing.pool.RemoteTraceback:“”“

     

回溯(最近通话最近):文件   “ C:\ Users \ WORK \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ multiprocessing \ pool.py”,   第121行,在工作程序中       结果=(True,func(* args,** kwds))文件“ C:\ Users \ WORK \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ multiprocessing \ pool.py”,   地图星号第44行       返回列表(map(* args))文件“ C:\ workspace \ emsdk \ emscripten \ 1.38.14 \ tools \ shared.py”,行1364,在   extract_archive_contents       断言不是os.path.dirname(f)AssertionError“”“

     

上述异常是以下异常的直接原因:

     

回溯(最近通话最近):文件   “ C:\ workspace \ emsdk \ emscripten \ 1.38.14 \ emcc.py”,第3092行,在          sys.exit(run())文件“ C:\ workspace \ emsdk \ emscripten \ 1.38.14 \ emcc.py”,行1699,正在运行       最终=共享.Building.link(linker_inputs,DEFAULT_FINAL,force_archive_contents = force_archive_contents,   temp_files = misc_temp_files,just_calculate = just_calculate)文件   “ C:\ workspace \ emsdk \ emscripten \ 1.38.14 \ tools \ shared.py”,第2011行,在   链接       Building.read_link_inputs([x用于文件中的x,如果不是x.startswith('-')])文件   “ C:\ workspace \ emsdk \ emscripten \ 1.38.14 \ tools \ shared.py”,行1852,在   read_link_inputs       object_names_in_archives = pool.map(extract_archive_contents,archive_names)文件   “ C:\ Users \ WORK \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ multiprocessing \ pool.py”,   地图中的268行       返回self._map_async(func,可迭代,mapstar,chunksize).get()文件   “ C:\ Users \ WORK \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ multiprocessing \ pool.py”,   657行,进入       提高self._value AssertionError gmake:*** [build]错误1

似乎是python无法在库文件中找到模块的问题

当我追踪错误在哪里

它们来自Python函数

# This function creates a temporary directory specified by the 'dir' field in
# the returned dictionary. Caller is responsible for cleaning up those files
# after done.
def extract_archive_contents(archive_file):


assert not os.path.dirname(f)  #This line causes the trouble

1 个答案:

答案 0 :(得分:1)

使用RUNTIME_LINKED_LIBS选项的正确方法应如下所示:

-s RUNTIME_LINKED_LIBS=['gdcmcharls.a', 'gdcmCommon.a', 'gdcmDICT.a', 'gdcmDSED.a']

但是,这可能不是您想要的解决方案。因为您要静态链接库,而不是动态链接。

将它们一起编译的正确方法就是将它们作为编译目标。完整的emcc选项如下所示:

emcc --other-options-you-use \
     -s WASM=1 \
     gdcmcharls.a \
     gdcmCommon.a \
     gdcmDICT.a \
     gdcmDSED.a \
     your_other_source_files_1.c \
     your_other_source_files_2.cpp \
     -o output.js

请勿使用-s SIDE_MODULE=1标志。这是用于动态链接。 -s EXPORT_ALL=1可能既不是您也不想要。