当我尝试将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
答案 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
可能既不是您也不想要。