Компиляция GMP/MPFR с Emscripten

Хорошо, это сводит меня с ума. Я пробовал это по крайней мере месяц, и нигде в Интернете это не помогает.

Я следовал за шагами этого. Даже пример не работает, когда я делаю эти шаги, потому что, когда я делаю это, я получаю это.

bitcode ==> javascript
warning: unresolved symbol: __gmpz_cmp
warning: unresolved symbol: __gmpz_mul_ui
warning: unresolved symbol: __gmpz_submul_ui
warning: unresolved symbol: __gmpz_init_set_ui
warning: unresolved symbol: __gmpz_mul_2exp
warning: unresolved symbol: __gmpz_init
warning: unresolved symbol: __gmpz_fdiv_qr
warning: unresolved symbol: __gmpz_add

И когда я запускаю полученный файл complete.js -

missing function: __gmpz_init
-1
-1

/home/ubuntu/workspace/gmp.js/complete.js:117
      throw ex;
      ^
abort(-1) at Error
    at jsStackTrace (/home/ubuntu/workspace/gmp.js/complete.js:1045:13)
    at stackTrace (/home/ubuntu/workspace/gmp.js/complete.js:1062:22)
    at abort (/home/ubuntu/workspace/gmp.js/complete.js:6743:44)
    at ___gmpz_init (/home/ubuntu/workspace/gmp.js/complete.js:1744:56)
    at Object._main (/home/ubuntu/workspace/gmp.js/complete.js:4978:2)
    at Object.callMain (/home/ubuntu/workspace/gmp.js/complete.js:6627:30)
    at doRun (/home/ubuntu/workspace/gmp.js/complete.js:6681:60)
    at run (/home/ubuntu/workspace/gmp.js/complete.js:6695:5)
    at Object.<anonymous> (/home/ubuntu/workspace/gmp.js/complete.js:6769:1)
    at Module._compile (module.js:541:32)
If this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.

3 ответа

Решение

Я обнаружил, что для этого нужно использовать 32-битную машину. У меня была 64-битная машина, поэтому я использовал chroot для 32-битной файловой системы, используя это руководство.

После этого все работало хорошо. Я делал программу Мандельброта, используя GMP и MPFR, и разместил скрипт компиляции (вместе с самой программой) онлайн на GitHub. Вот оно Адаптируйте его под свои проекты.

Эти инструкции предназначены для хоста под управлением amd64 (multiarch) Debian Stretch. Я попробовал на трех хостах, два удалось, другой не удалось с ld Недостаточно памяти clang, YMMV. Как говорит Flarp, ​​похоже, что GMP требуется 32-битная среда для работы с Emscripten, следовательно, chroot. После установки мой chroot был 5,2 ГБ большого размера. Но я бы не рекомендовал использовать его для кода, интенсивно использующего вычислительные ресурсы, если вы можете избежать этого, в одном тесте мой нативный код был в 90 раз быстрее, чем тот же код, скомпилированный с Emscripten, работающим в nodejs...

emscripten 1.38.9

mkdir emscripten
sudo apt-get install debootstrap
sudo debootstrap --arch i386 stretch emscripten
sudo chroot emscripten /bin/bash
echo "deb http://security.debian.org/debian-security stretch/updates main" >> /etc/apt/sources.list
echo "deb http://ftp.debian.org/debian stretch-backports main" >> /etc/apt/sources.list
apt update
apt install python cmake g++ git lzip
apt install -t stretch-backports nodejs
echo "none /dev/shm tmpfs rw,nosuid,nodev,noexec 0 0" >> /etc/fstab
mount /dev/shm
adduser emscripten
su - emscripten
git clone https://github.com/juj/emsdk.git
cd emsdk
./emsdk update
./emsdk install latest-32bit
./emsdk activate latest-32bit
source ./emsdk_env.sh
mkdir -p ${HOME}/opt/src
cd ${HOME}/opt/src

gmp 6.1.2

wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.lz
tar xf gmp-6.1.2.tar.lz
cd gmp-6.1.2
CC_FOR_BUILD=/usr/bin/gcc ABI=standard emconfigure ./configure \
  --build i686-pc-linux-gnu --host none --disable-assembly --enable-cxx \
  --prefix=${HOME}/opt
make -j 6
make install
cd ..

MPFR 4.0.1

wget https://www.mpfr.org/mpfr-current/mpfr-4.0.1.tar.xz
wget https://www.mpfr.org/mpfr-current/allpatches
tar xf mpfr-4.0.1.tar.xz
cd mpfr-4.0.1
patch -N -Z -p1 < ../allpatches
emconfigure ./configure --build i686-pc-linux-gnu --host none \
  --prefix=${HOME}/opt --with-gmp=${HOME}/opt
make -j 6
make install
cd ..

MPC 1.1.0

wget https://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz
tar xf mpc-1.1.0.tar.gz
cd mpc-1.1.0
emconfigure ./configure --build i686-pc-linux-gnu --host none \
  --prefix=${HOME}/opt --with-gmp=${HOME}/opt --with-mpfr=${HOME}/opt
make -j 6
make install
cd ..

Привет, мир

Ваша любимая программа с использованием GMP / MPFR /MPC:

emcc -o hello.js hello.c \
  ${HOME}/opt/lib/libmpc.a ${HOME}/opt/lib/libmpfr.a ${HOME}/opt/lib/libgmp.a
nodejs hello.js

Однако эта последняя команда emcc не прошла в моем последнем тесте с ошибкой об отсутствии двоичного файла, см. https://github.com/kripken/emscripten/issues/6892

Я упаковал его в библиотеку NPM под названием gmp-wasm. Он экспортирует как низкоуровневые функции, так и неизменяемую высокоуровневую оболочку:

Другие вопросы по тегам