2014-10-22 15 views
5

Ho scaricato e installato le nightly Rust e cargo sulla mia macchina, e utilizzati Cargo per generare un nuovo progetto binario:Perché Rust non riesce a collegarsi su Windows?

[email protected] ~ 
$ cargo new test --bin 

Poi tento di fare funzionare questo progetto vergine, ancora una volta con un nuovo, senza macchia installazione di entrambi ruggine e Cargo, e ottenere questo:

[email protected] ~/test 
$ cargo run --verbose 
    Compiling test v0.0.1 (file:///C:/cygwin64/home/Cifram/test) 
    Running `rustc C:\cygwin64\home\Cifram\test\src\main.rs --crate-name test --crate-type bin -g --out-dir C:\cygwin64\home\Cifram\test\target --dep-info C:\cygwin64\home\Cifram\test\target\.fingerprint\test-51757ad0485ed143\dep-bin-test -L C:\cygwin64\home\Cifram\test\target -L C:\cygwin64\home\Cifram\test\target\deps` 
error: linking with `gcc` failed: exit code: 1 
note: gcc '-m64' '-L' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib' '-o' 'C:\cygwin64\home\Cifram\test\target\test.exe' 'C:\cygwin64\home\Cifram\test\target\test.o' '-Wl,--whole-archive' '-lmorestack' '-Wl,--no-whole-archive' '-fno-lto' '-fno-use-linker-plugin' '-Wl,--gc-sections' '-static-libgcc' '-Wl,--enable-long-section-names' '-Wl,--nxcompat' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libnative-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libstd-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libsync-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\librustrt-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libcollections-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\liballoc-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libunicode-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\liblibc-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\librand-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libcore-4e7c5e5c.rlib' '-L' 'C:\cygwin64\home\Cifram\test\target' '-L' 'C:\cygwin64\home\Cifram\test\target\deps' '-L' 'C:\cygwin64\home\Cifram\test\.rust' '-L' 'C:\cygwin64\home\Cifram\test' '-Wl,--whole-archive' '-Wl,-Bstatic' '-Wl,--no-whole-archive' '-Wl,-Bdynamic' '-lws2_32' '-lcompiler-rt' 
note: C:\cygwin64\home\Cifram\test\target\test.o: file not recognized: File format not recognized 
collect2.exe: error: ld returned 1 exit status 

error: aborting due to previous error 
Could not compile `test`. 

Caused by: 
    Process didn't exit successfully: `rustc C:\cygwin64\home\Cifram\test\src\main.rs --crate-name test --crate-type bin -g --out-dir C:\cygwin64\home\Cifram\test\target --dep-info C:\cygwin64\home\Cifram\test\target\.fingerprint\test-51757ad0485ed143\dep-bin-test -L C:\cygwin64\home\Cifram\test\target -L C:\cygwin64\home\Cifram\test\target\deps` (status=101) 

io non sono sicuro perché rustc sta invocando gcc, dal momento che ho capito è stato costruito in cima a LLVM. Ho installato gcc, tramite MinGW, quindi il mio primo pensiero è stato che forse l'installazione di gcc stava interferendo.

[email protected] ~ 
$ gcc -v 
Using built-in specs. 
COLLECT_GCC=C:\MinGW\bin\gcc.exe 
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.8.1/lto-wrapper.exe 
Target: mingw32 
Configured with: ../gcc-4.8.1/configure --prefix=/mingw --host=mingw32 --build=mingw32 --without-pic --enable-shared --enable-static --with-gnu-ld --enable-lto --enable-libssp --disable-multilib --enable-languages=c,c++,fortran,objc,obj-c++,ada --disable-sjlj-exceptions --with-dwarf2 --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --with-gmp=/usr/src/pkg/gmp-5.1.2-1-mingw32-src/bld --with-mpc=/usr/src/pkg/mpc-1.0.1-1-mingw32-src/bld --with-mpfr= --with-system-zlib --with-gnu-as --enable-decimal-float=yes --enable-libgomp --enable-threads --with-libiconv-prefix=/mingw32 --with-libintl-prefix=/mingw --disable-bootstrap LDFLAGS=-s CFLAGS=-D_USE_32BIT_TIME_T 
Thread model: win32 
gcc version 4.8.1 (GCC) 

Quindi è una versione aggiornata di gcc. Ma ancora, potrebbe non essere quello che si aspetta il ruggine. Così ho rimosso C: \ MinGW \ bin dal mio percorso e provato di nuovo, ed ho ottenuto:

[email protected] ~/test 
$ cargo run --verbose 
    Compiling test v0.0.1 (file:///C:/cygwin64/home/Cifram/test) 
    Running `rustc C:\cygwin64\home\Cifram\test\src\main.rs --crate-name test --crate-type bin -g --out-dir C:\cygwin64\home\Cifram\test\target --dep-info C:\cygwin64\home\Cifram\test\target\.fingerprint\test-51757ad0485ed143\dep-bin-test -L C:\cygwin64\home\Cifram\test\target -L C:\cygwin64\home\Cifram\test\target\deps` 
error: linking with `gcc` failed: exit code: 1 
note: gcc '-m64' '-L' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib' '-o' 'C:\cygwin64\home\Cifram\test\target\test.exe' 'C:\cygwin64\home\Cifram\test\target\test.o' '-Wl,--whole-archive' '-lmorestack' '-Wl,--no-whole-archive' '-fno-lto' '-fno-use-linker-plugin' '-Wl,--gc-sections' '-static-libgcc' '-Wl,--enable-long-section-names' '-Wl,--nxcompat' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libnative-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libstd-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\librand-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libsync-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\librustrt-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libcollections-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\liballoc-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\liblibc-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libunicode-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libcore-4e7c5e5c.rlib' '-L' 'C:\cygwin64\home\Cifram\test\target' '-L' 'C:\cygwin64\home\Cifram\test\target\deps' '-L' 'C:\cygwin64\home\Cifram\test\.rust' '-L' 'C:\cygwin64\home\Cifram\test' '-Wl,--whole-archive' '-Wl,-Bstatic' '-Wl,--no-whole-archive' '-Wl,-Bdynamic' '-lws2_32' '-lcompiler-rt' 
note: ld: this linker was not configured to use sysroots 

error: aborting due to previous error 
Could not compile `test`. 

Caused by: 
    Process didn't exit successfully: `rustc C:\cygwin64\home\Cifram\test\src\main.rs --crate-name test --crate-type bin -g --out-dir C:\cygwin64\home\Cifram\test\target --dep-info C:\cygwin64\home\Cifram\test\target\.fingerprint\test-51757ad0485ed143\dep-bin-test -L C:\cygwin64\home\Cifram\test\target -L C:\cygwin64\home\Cifram\test\target\deps` (status=101) 

Beh, si tratta di un errore di un po 'diversa, ma non è davvero niente di meglio. Lo stesso comando gcc sta fallendo, ma, prima che l'errore è stato:

C:\cygwin64\home\Cifram\test\target\test.o: file not recognized: File format not recognized 

E ora è:

ld: this linker was not configured to use sysroots 

non trovo uno di questi terribilmente significativo. Ho provato a eseguire "rustc main.rs" direttamente. Ho gli stessi errori (tranne che era "src \ main.o" invece di "target \ test.o"). Ho provato a fare tutto questo usando la commandline nativa di Windows invece di cygwin. Gli stessi errori Quindi non sembra essere Cargo o Cygwin a dare la colpa. Ho anche provato a scaricare l'ultima versione "stabile" di Rust (0.12.0), e ho ancora gli stessi errori. Ho cercato su Google questi errori e sono uscito vuoto. Quindi sono a corto di idee.

Aiuto?

+2

Secondo [Rust's wiki] (https://github.com/rust-lang/rust/wiki/Using-Rust-on-Windows), si dovrebbe rimuovere MinGW da PATH per usare il gcc che è in bundle con Rust. Nelle versioni precedenti alla 0.12, era necessario installare MinGW separatamente. Penso che il tuo primo errore fosse dovuto all'utilizzo di un compilatore Rust che puntava su x86-64 con un linker che indirizzava i386. Per quanto riguarda il tuo secondo errore, non lo so. –

+0

Ah, grazie per il link! Questo almeno risolve un pezzo del puzzle. Anche se è davvero scomodo che non possa avere gcc sul mio percorso durante l'utilizzo di Rust. Rende il processo di compilazione delle librerie C a cui voglio collegarmi in Rust (come SDL2) una vera seccatura. –

risposta

1

Successo! Il problema, si scopre, è che avevo anche installato ld, all'interno di cygwin. Quindi, da quello che posso dire, stava usando la versione di gcc fornita come parte di rustc, ma che gcc stava chiamando C: \ cygwin64 \ bin \ ld.exe, invece del proprio ld interno.

Non appena ho rimosso ld, tutto ha funzionato.

Intendiamoci, questo rafforza il punto che ho fatto nel mio commento: Apparentemente non posso fare lo sviluppo di Rust e lo sviluppo C/C++ sulla stessa macchina allo stesso tempo. Anche allo scopo di compilare librerie C, desidero accedere a Rust, come SDL2 o GLFW. Questo è terribilmente inopportuno. Se rustc necessita di versioni specifiche di gcc e ld e viene fornito con le versioni corrette, non dovrebbe essere necessario chiamare le versioni di sistema. Se deve essere possibile eseguire l'override delle sue versioni gcc o ld, questa operazione dovrebbe essere eseguita tramite un'opzione esplicita della riga di comando.

Modifica: Aggiunta di un "non" mancante che invertiva inavvertitamente il significato di una frase.

+1

"deve essere impostato di default per chiamare le versioni di sistema" => Il problema è che non esiste una "versione di sistema" di GCC su Windows. Esistono varie versioni concorrenti (MinGW, MinGW-w64, Cygwin). Puoi certamente usare la stessa macchina per lo sviluppo di Rust e C/C++, ma potresti voler creare alcuni file batch per configurare correttamente le variabili d'ambiente per ognuno (se usi un interprete di comandi/shell per richiamare i compilatori). –

+0

Mi dispiace, mi mancava un "non" in quella frase. Fisso. –

1

Come soluzione alternativa, ho manipolato la variabile path quando si chiama Rust dal mio ambiente cygwin shell. Per come la capisco, Rust utilizzerà il percorso di sistema, per cercare gcc, e quindi cercherà di usarlo. Manipolando il percorso per rimuovere i GCC non voluti, esso cadrà indietro e utilizzerà quello con cui è stato installato l'installatore di ruggine.

PATH = '/ c/Program Files/Rust/bin' cargo accumulo

* Utilizzare il percorso Cygwin corretto per cui è stato installato Rust. Sul mio sistema, questo è/c/Programma ...

+0

Non è una cattiva idea. È sfortunato essere asservito alla versione gcc di Rust, ma è meglio dover ricomporre i miei percorsi ogni volta che voglio passare dallo sviluppo di Rust a quello di C/C++. –

Problemi correlati