
Hace mucho tiempo escribí un shell realmente tosco y primitivo en C++, y recientemente descubrí asm.js, así que pensé que sería genial intentar compilarlo y ejecutarlo en un navegador, pero no puedo porque los paquetes apt son incompatibles. Instalé los paquetes llvm, clang y emscripten y están todos actualizados con lo que hay en los repositorios. Aquí está mi archivo de prueba hello.c
:
#include <stdio.h>
int main(){
printf("Hello World!\n");
return 0;
}
Esto se compila y funciona bien con clang hello.c && ./a.out
, pero cuando lo ejecuto emcc hello.c
aparece el error
/usr/bin/lli: error creating EE: No available targets are compatible with this triple, see -version for the available targets. FAIL: Running the generated program failed!
cualhacegenerate a.out.js
, pero solo contiene la primera línea de referencia ya a.out.js.map
que es SourceMap (el mapa en sí solo contiene la línea: {"version":3,"file":"a.out.js","sources":[],"names":[],"mappings":""}
. Ahora CREO que esto significa que el llvm no se compiló con -targets=all
, o al menos sin, el js
objetivo, así que intenté compilarlo de la fuente. Obtuve los últimos paquetes, siguiendo meticulosamente los pasos descritos.aquíyaquíy ambos paquetes se compilaron correctamente. Sin embargo, cuando se ejecuta de esta manera, emiscript se quejó de que "esperaba 3.4" pero obtuvo "(tags/RELEASE_380/final)" para la información de la versión y posteriormente falla. Solo para estar seguro, purgué emscripten, llvm y clang antes de comenzar la compilación del código fuente, y espero que 3.4 sea la versión 3.4.mínimoversión, no lasólo apoyadoversión, porque creo que la última versión es 3.9, y los documentos no dicen que se tome ninguna consideración especial. De todos modos, intenté compilar el 3.4 desde el código fuente, pero aparentemente no reconoce 'js' como un objetivo válido (intenté compilarlo sin eso y ejecutarlo de todos modos: sin dados). Es extraño para mí que el emscripten
paquete apt no incluya el clang/llvm correctamente compilado como una dependencia, así que ¿tal vez estoy haciendo mal la invocación? Los documentos dicen que debería poder hacer lo que estoy haciendo, pero soy nuevo en clang/emscripten, así que tal vez tenga que configurar el entorno clang primero o, alternativamente, vincular algo explícitamente.
SYSINFO
Versión e información de clang/clang++ (de clang --version
):
clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
Target: i686-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Versión e información de llvm (de lli --version
):
LLVM version 3.8.0
Optimized build.
Built Jul 9 2016 (11:22:59).
Default target: i686-pc-linux-gnu
Host CPU: broadwell
versión de emscripten (de emcc --version
): 1.22.1
Contenido de los generados más recientemente ~/.emscripten_sanity
:1.22.1|le32-unknown-nacl|/usr/bin|(tags/RELEASE_380/final)
pasta de última generación~/.emscsripten
información del núcleo (de uname -srpmio
):Linux 4.4.0-21-generic i686 i686 i686 GNU/Linux
El sistema es una máquina virtual VirtualBox con extensiones instaladas, que ejecuta Linux Mint 18 "Sarah" Cinnamon como una máquina de 32 bits con 2 núcleos de CPU, 4 GB de RAM, 512 MB de memoria de video y una imagen de disco virtual de ~50 GB. No hay ningún otro sistema operativo presente, básicamente una instalación básica. Actualmente tiene las versiones predeterminadas de clang, llvm y emscripten disponibles en los repositorios de apt.