2014-10-22 17 views
5

Ben indirilen ve benim makinede Pas ve Kargo nightly'leri yüklü ve yeni bir ikili projeyi oluşturmak için Kargo kullandı:Rust neden Windows üzerinde bağlantı kuramıyor?

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

Sonra lekesiz hem yükleyin taze ile yine bu bakire projeyi çalıştırmayı denediğinizde pas ve Kargo ve bu olsun:

[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) 

Ben o LLVM üzerine inşa edilmiş anlaşılan beri rustc, gcc çağırma neden emin değilim. MinGW aracılığıyla gcc yüklü, bu yüzden benim ilk düşüncem belki de gcc yüklemesi müdahale ediyordu.

[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) 

Bu, gcc'nin güncel bir sürümüdür. Ama yine de, pascanın beklediği şey olmayabilir. Benim yolundan MinGW \ \ bin ve tekrar denedi ve var: Ben C kaldırıldı

[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) 

Eh, biraz daha farklı bir hatadır, ama gerçekten hiç iyi. Aynı gcc komutu başarısız olduğunu, ancak, hata olmadan önce:

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

Ve şimdi: Ben bu korkunç anlamlı birini bulamazsanız

ld: this linker was not configured to use sysroots 

. Doğrudan "rustc main.rs" çalıştırmayı denedim. Aynı hataları aldım ("target \ test.o" yerine "src \ main.o" dışında). Tüm bunları cygwin yerine yerel Windows komut satırından yapmayı denedim. Aynı hatalar. Bu yüzden suçlanacak Kargo veya cygwin gibi görünmüyor. Ayrıca, Rust'un ("0.12.0") son "kararlı" sürümünü indirmeyi denedim ve hala aynı hataları aldım. Bu hatalar için googled ettik ve boş çıktım. Bu yüzden fikirlerim tükeniyor.

Yardım?

+2

[Rust'un wiki] 'sine göre (https://github.com/rust-lang/rust/wiki/Using-Rust-on-Windows) Rust ile birlikte gelen gcc'yi kullanmak için PATH'den MinGW'yi çıkarın. 0.12'den önceki sürümlerde, MinGW'yi ayrı olarak kurmak gerekliydi. İlk hatanın, i386'yı hedefleyen bir bağlayıcılı x86-64 ile bir Rust derleyicisini kullanmaktan kaynaklandığını düşünüyorum. İkinci halimize gelince, bilmiyorum. –

+0

Ah, bağlantı için teşekkürler! En azından bulmacanın bir parçasını çözüyor. Her ne kadar Rust kullanırken yolumda gcc olamayacağımı gerçekten rahatsız edici olsa da. Rust'ta (SDL2 gibi) bağlantı kurmak istediğim C kütüphanelerinin derlenmesi sürecini gerçek bir güçlük haline getirir. –

cevap

1

Başarı! Sorun şu ki, Cygwin’de de ld yüklü olmalı. Anlatabildiğim kadarıyla, o, pascanın bir parçası olarak gelen gcc'nin sürümünü kullanıyordu, fakat bu gcc, kendi dahili ld yerine C: \ cygwin64 \ bin \ ld.exe'yi çağırıyordu.

Ld'yi kaldırır kaldırmaz, her şey çalıştı.

Bu sizin yaptığınız noktayı pekiştirdiğinizi unutmayın: Görünüşe göre aynı makinede Rust geliştirme ve C/C++ geliştirme işlemini yapamıyorum. SDL2 veya GLFW gibi Rust'ta erişmek istediğim C kütüphanelerini derlemek için bile. Bu çok rahatsız edici. Eğer rustc, gcc ve ld'nin belirli sürümlerine ihtiyaç duyarsa ve doğru sürümlerle birlikte gönderilirse, sistem sürümlerini çağırmak varsayılan olarak yapılmamalıdır. Gcc veya ld sürümlerini geçersiz kılmak mümkün olması gerekiyorsa, bu açık bir komut satırı seçeneği ile yapılmalıdır.

Düzenleme: Bir cümlenin anlamını yanlışlıkla tersine çeviren eksik "değil" ekleme.

+1

"sistem sürümlerini çağırmak varsayılan" => Şey, Windows'da GCC'nin "sistem sürümü" diye bir şey yok. Çeşitli rakip sürümleri vardır (MinGW, MinGW-w64, Cygwin). Aynı makineyi Rust ve C/C++ geliştirme için de kullanabilirsiniz, ancak bazı değişkenlerin her biri için ortam değişkenlerini düzgün bir şekilde ayarlamasını isteyebilirsiniz (eğer derleyicileri çağırmak için bir komut yorumlayıcısı/kabuk kullanırsanız). –

+0

Üzgünüz, bu cümlede bir "eksik" eksiktim. Sabit. –

1

Alternatif bir çözüm olarak, cygwin kabuk ortamımdaki Rust'u çağırırken yol değişkenini değiştirdim. Anladığım şekilde, Rust gcc'yi aramak için sistem yolunu kullanacak ve sonra onu kullanmaya çalışacaktır. GCC'nin istemediği yolu kaldırmak için yolu değiştirerek geriye düşecek ve pas yükleyicinin geldiği yeri kullanacaktır.

PATH = '/ c/Program Files/Pas/bin' kargo inşa

* Eğer Rust yüklü yere doğru cygwin yolunu kullanın. Sistemimde, bu/c/Program ...

+0

Kötü bir fikir değil. Rust'taki gcc versiyonuna köle olmak talihsiz bir şey, ama Rust ve C/C++ geliştirme arasında geçiş yapmak istediğimde her zaman yollarımı yeniden jiggerlemek zorunda kalıyor. –