Статическая ошибка библиотеки Emscripten: ошибка компиляции в wasm: импорт 'env.getTempRet0' - PullRequest
0 голосов
/ 19 марта 2019

Произошла ошибка при попытке связать мой код 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

1 Ответ

1 голос
/ 19 марта 2019

Правильный способ использования опции 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, вероятно, вы не хотите ни того, ни другого.

...