Произошла ошибка при попытке связать мой код wasm со статическими библиотеками, библиотекой Grassroot DICOM.
Прежде всего, я компилирую Grassroot DICOM, используя cmake с внешним набором инструментов и cmake, найденный из
/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: "" "Traceback (последний вызов
последний): файл
"C: \ Users \ WORK \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib \ многопроцессорная \ pool.py",
строка 121, в рабочем
result = (True, func (* args, ** kwds)) Файл "C: \ Users \ I-w-I \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ multiprocessing \ pool.py",
линия 44, в mapstar
возвратный список (map (* args)) Файл "C: \ workspace \ emsdk \ emscripten \ 1.38.14 \ tools \ shared.py", строка 1363, в
extract_archive_contents
не утверждать os.path.dirname (f) ошибка утверждения.
Затем я изменил способ связи с 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: ошибка LinkEr: импорт 'env.getTempRet0' is
недействительным. Ожидаемый тип Функция
возврат к реализации ArrayBuffer
и в консоли показывает эту ошибку
LinkError: импорт 'env.getTempRet0' недействителен. Ожидаемый тип Функция
Просто о моей машине. Я использую 64-битную Windows10 и
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: "" "
Traceback (последний вызов был последним): File
"C: \ Users \ WORK \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib \ многопроцессорная \ pool.py",
строка 121, в рабочем
result = (True, func (* args, ** kwds)) Файл "C: \ Users \ WORK \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ multiprocessing \ pool.py",
линия 44, в mapstar
возвращаемый список (map (* args)) Файл "C: \ workspace \ emsdk \ emscripten \ 1.38.14 \ tools \ shared.py", строка 1364, в
extract_archive_contents
assert not os.path.dirname (f) AssertionError "" "
Вышеуказанное исключение было прямой причиной следующего исключения:
Traceback (последний вызов был последним): File
«C: \ workspace \ emsdk \ emscripten \ 1.38.14 \ emcc.py», строка 3092, в
sys.exit (run ()) Файл "C: \ workspace \ emsdk \ emscripten \ 1.38.14 \ emcc.py", строка 1699, в запуске
final = shared.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 ('-')]) File
"C: \ workspace \ emsdk \ emscripten \ 1.38.14 \ tools \ shared.py", строка 1852, в
read_link_inputs
Имя_объекта_in_archives = pool.map (extract_archive_contents, archive_names) Файл
"C: \ Users \ WORK \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib \ многопроцессорная \ pool.py",
линия 268, на карте
вернуть файл self._map_async (func, iterable, mapstar, chunksize) .get () Файл
"C: \ Users \ WORK \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib \ многопроцессорная \ pool.py",
линия 657, в get
поднять 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