我正在尝试将多线程应用程序编译为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编译为Emscripten使用的llvm字节码格式。为此,我尝试运行“ emmake make”,以便emscripten框架使用合适的编译器执行OpenMP makefile。由于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."
有人知道我可以做些什么吗?