Я пытаюсь скомпилировать многопоточное приложение в WebAssembly. Приложение использует OpenMP для многопоточности.
Для компиляции я использую платформу Emscripten.
Я уже скачал исходные файлы для OpenMP и скомпилировал его для моего хоста с помощью make. С помощью следующей команды я могу связать ее с простым демонстрационным приложением на моей машине:
g++ -Wall -Werror -pedantic main.o -o main.x /$PATH_TO_OPENMP/build/runtime/src/libgomp.a -pthread -lstdc++ -Wl,--no-as-needed -ldl
Затем я попытался скомпилировать OpenMP в формат байт-кода llvm, используемый Emscripten. Для этого я попытался запустить emmake make, чтобы платформа emscripten выполняла файлы сборки OpenMP с подходящим компилятором. Поскольку emscripten не любит общие объектные файлы, я скомпилировал их в статическую библиотеку .a файлы.
Это работает и фактически дает мне объектные файлы, на которые я могу ссылаться.
Затем я хотел связать мое демонстрационное приложение с помощью следующей команды
em++ -Wall -Werror -pedantic main.o -o main.html /home/main/data/Programming/openMP/openmp_web/build/runtime/src/libgomp.a -pthread -lstdc++ -Wl,--no-as-needed -ldl
Но я получаю эти предупреждения, что он не может ссылаться на файлы OpenMP:
shared:WARNING: object /tmp/emscripten_temp_ONa0eU_archive_contents/kmp_atomic.cpp.o is not a valid object file for emscripten, cannot link
.
.
shared:WARNING: object /tmp/emscripten_temp_ONa0eU_archive_contents/kmp_str.cpp.o is not a valid object file for emscripten, cannot link
shared:WARNING: object /tmp/emscripten_temp_ONa0eU_archive_contents
Итак, я решил, что я должен скомпилировать OpenMP с неверным компилятором. Затем я попытался изменить компилятор при сборке библиотеки с помощью следующих команд:
cmake -DCMAKE_C_COMPILER=emcc -DCMAKE_CXX_COMPILER=em++ -DLIBOMP_LIB_TYPE=normal -DLIBOMP_ENABLE_SHARED=OFF -DCMAKE_BUILD_TYPE=Release -DLIBOMP_ARCH=x86_64 OPENMP_STANDALONE_BUILD=1 ..
emmake make
Но это приводит к странным ошибкам в некоторых пропущенных системных переменных
/home/main/data/Programming/openMP/openmp_web/runtime/src/kmp_platform.h:82:2: error: Unknown OS
/home/main/data/Programming/openMP/openmp_web/runtime/src/kmp_platform.h:203:2: error: Unknown or unsupported architecture
In file included from /home/main/data/Programming/openMP/openmp_web/runtime/src/kmp_alloc.cpp:13:
In file included from /home/main/data/Programming/openMP/openmp_web/runtime/src/kmp.h:77:
/home/main/data/Programming/openMP/openmp_web/runtime/src/kmp_os.h:171:2: error: "Can't determine size_t printf format specifier."
Кто-нибудь имеет представление о том, что я мог бы сделать по-другому?