2015-04-29 27 views
5

Napisałem program Nim,Nim krzyż kompilacji do C

echo("Hello.") 

A potem próbował przejechać kompilacji na komputerze z systemem Linux,

nim c --cpu:i386 --os:linux -c hello.nim 

Ten produkowany następujący wynik:

config/nim.cfg(45, 2) Hint: added path: '/Users/connor/.babel/pkgs/' [Path] 
config/nim.cfg(46, 2) Hint: added path: '/Users/connor/.nimble/pkgs/' [Path] 
Hint: used config file '/usr/local/lib/nim-0.10.2/config/nim.cfg' [Conf] 
Hint: system [Processing] 
Hint: hello [Processing] 
Hint: operation successful (8753 lines compiled; 0.140 sec total; 14.148MB)[SuccessX] 

W tym momencie zmieniłem katalog na nimcache/ i próbowałem wykonać:

gcc hello.c -o hello.o 

Ale dał mi błąd:

hello.c:5:10: fatal error: 'nimbase.h' file not found 
#include "nimbase.h" 
     ^
1 error generated. 

Pomyślałem: „nic wielkiego, po prostu znaleźć nimbase.h i upuść go w katalogu tam nimcache”, ale potem dostałam nowy błąd,

In file included from hello.c:5: 
./nimbase.h:385:28: error: 'assert_numbits' declared as an array with a 
     negative size 
    ...sizeof(NI) == sizeof(void*) && NIM_INTBITS == sizeof(NI)*8 ? 1 : -1]; 
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
1 error generated. 

Nie jestem pewien, co mam z tym zrobić. Próbowałem użyć opcji --genScript, ale to spowodowało podobne błędy. Używam systemu OS X Yosemite.

Dzięki!

Aktualizacja:

I nie był pewien, jak wielu architekturach wspierane były dla opcji --cpu:, ale znalazłem (częściowe?) Wykaz na stanowisku What makes Nim practical blogu. Skończyło się na wywołaniu,

To zapobiegło wystąpieniu błędu podczas kompilacji na moim komputerze z systemem Linux. Jeśli używasz systemu Linux lub OS X nie wiesz, co Twój architektura procesora jest można nazwać,

less /proc/cpuinfo 
+1

Docs powiedzieć, że „wygenerowany kod C nie jest niezależna od platformy C kod wygenerowany dla systemu Linux nie kompiluje się na przykład w systemie Windows. " i "przenieś kod C i skrypt kompilacyjny compile_myproject.sh do twojego komputera z systemem i386". Więc może nie możesz tego zrobić na OS X. – Thilo

+1

O tak, pamiętam, że to czytałem. Wrzuciłem 'nimcache' (z' nimbase.h') do mojego komputera z linuxem i ponownie otrzymałem ostatni błąd. Czy nadal coś mi brakuje? – cjohnson318

Odpowiedz

5

Ostatnim problemem jest to, ponieważ używasz gcc dla x86_64 łuku, podczas gdy źródła zostały wygenerowane dla i386 łuku.

+2

Tak. Statycznie zapewnia, że ​​jesteś na platformie 32-bitowej. – StilesCrisis

+0

Dziękuję wszystkim, nadal mam problemy ze skompilowaniem, ale to odpowiada na pytanie, które miałem na temat błędu, który widziałem. Użycie 'nim c --cpu: amd64 --os: linux -c hello.nim' wpadło na marne. – cjohnson318

2

Miałem ten sam problem, otrzymując nim skompilować pliki wykonywalne dla systemu Windows, z maszyny GNU/Linux, więc zrobiłem skrypt bash. Przechodzi ścieżkę do katalogu zawierającego pliki źródłowe *.nim i nazwę pliku wykonywalnego do wyprowadzenia.

Jestem pewien, że można zamienić się z kompilatora GCC (MinGW w tym przypadku) i zmienić przełącznik --os: odpowiednio:.

#!/usr/bin/env bash 
# Nim must generate C sources only, to be fed to MingW 
nim c --cpu:amd64 --os:windows --opt:speed --embedsrc --threads:on --checks:on -c -d:release $1/*.nim 
# Copy nimbase.h so MingW32 can find it during compilation and linking 
cp /opt/Nim/lib/nimbase.h $1/nimcache/nimbase.h 
mkdir -p $1/bin 
cd $1/nimcache && x86_64-w64-mingw32-gcc -save-temps $1/nimcache/*.c -o $1/bin/$2.exe 
rm $1/nimcache/*.{i,s} # only care about *.o objects 
ls -lAhF $1/nimcache 
ls -lAhF $1/bin