2014-10-22 16 views
5

tôi tải về và cài đặt các nightly Rust và hàng hóa trên máy tính của tôi, và sử dụng hàng hóa để tạo ra một dự án nhị phân mới:Tại sao Rust không liên kết trên Windows?

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

Sau đó, tôi cố gắng để chạy dự án trinh nữ này, một lần nữa với một tươi, untarnished cài đặt của cả hai Rust and Cargo và nhận được thông tin này:

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

Tôi không chắc tại sao rustc gọi gcc, vì tôi hiểu nó được xây dựng trên LLVM. Tôi đã cài đặt gcc, thông qua MinGW, vì vậy suy nghĩ đầu tiên của tôi là có thể cài đặt gcc đã can thiệp.

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

Vì vậy, đây là phiên bản cập nhật của gcc. Nhưng vẫn còn, nó có thể không phải là những gì rustc đang mong đợi. Vì vậy, tôi đã xóa C: \ MinGW \ bin khỏi đường dẫn của tôi và thử lại, và nhận:

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

Vâng, đó là lỗi hơi khác, nhưng không thực sự tốt hơn. Lệnh gcc cùng là thất bại, nhưng, trước khi báo lỗi là:

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

Và bây giờ là:

ld: this linker was not configured to use sysroots 

Tôi không tìm thấy một trong những khủng khiếp có ý nghĩa. Tôi đã thử chạy "rustc main.rs" trực tiếp. Có cùng lỗi (ngoại trừ "src \ main.o" thay vì "target \ test.o"). Đã cố gắng thực hiện tất cả điều này từ dòng lệnh Windows gốc thay vì Cygwin. Lỗi tương tự. Vì vậy, nó không có vẻ là hàng hóa hoặc Cygwin đó là để đổ lỗi. Tôi cũng đã thử tải xuống bản phát hành "ổn định" cuối cùng của Rust (0.12.0) và vẫn gặp lỗi tương tự. Tôi đã googled cho những lỗi này, và đi lên trống rỗng. Vì vậy, tôi hết ý tưởng.

Trợ giúp?

+2

Theo [Wiki của Rust] (https://github.com/rust-lang/rust/wiki/Using-Rust-on-Windows), bạn nên loại bỏ MinGW khỏi PATH để sử dụng gcc đi kèm với Rust. Trong các bản phát hành trước 0.12, cần cài đặt riêng MinGW. Tôi nghĩ rằng lỗi đầu tiên của bạn là do sử dụng trình biên dịch Rust nhắm mục tiêu x86-64 với trình liên kết nhắm mục tiêu i386. Đối với lỗi thứ hai của bạn, tôi không biết. –

+0

Ah, cảm ơn vì liên kết! Điều đó ít nhất là giải quyết một phần của câu đố. Mặc dù nó thực sự bất tiện mà tôi không thể có gcc trong con đường của tôi trong khi sử dụng Rust. Nó làm cho quá trình biên dịch bất kỳ thư viện C nào mà tôi muốn liên kết đến trong Rust (chẳng hạn như SDL2) là một rắc rối thực sự. –

Trả lời

1

Thành công! Vấn đề, nó quay ra, là tôi cũng đã cài đặt ld, bên trong Cygwin. Vì vậy, từ những gì tôi có thể nói, nó đã được sử dụng phiên bản gcc mà tàu như là một phần của rustc, nhưng gcc đã được gọi ra C: \ cygwin64 \ bin \ ld.exe, thay vì nó ld nội bộ của riêng.

Ngay sau khi tôi xóa ld, mọi thứ đã hoạt động.

Quan tâm đến bạn, điều này củng cố điểm tôi đưa ra trong nhận xét của mình: Rõ ràng tôi không thể phát triển Rust và phát triển C/C++ trên cùng một máy cùng một lúc. Ngay cả với mục đích biên dịch các thư viện C tôi muốn truy cập trong Rust, như SDL2 hoặc GLFW. Điều này thật bất tiện. Nếu rustc cần các phiên bản cụ thể của gcc và ld, và giao hàng với các phiên bản chính xác, nó không nên mặc định để gọi ra các phiên bản hệ thống. Nếu nó cần phải có khả năng ghi đè lên phiên bản gcc hoặc ld của nó, điều này nên được thực hiện thông qua một tùy chọn dòng lệnh rõ ràng.

Chỉnh sửa: Thêm một số "không" bị vô tình đảo ngược ý nghĩa của câu.

+1

"nó nên mặc định để gọi ra các phiên bản hệ thống" => Điều này, không có điều như là một "phiên bản hệ thống" của GCC trên Windows. Có nhiều phiên bản cạnh tranh khác nhau (MinGW, MinGW-w64, Cygwin). Bạn chắc chắn có thể sử dụng cùng một máy để phát triển Rust và C/C++, nhưng bạn có thể muốn tạo một số tệp batch để thiết lập các biến môi trường cho mỗi (nếu bạn sử dụng một trình thông dịch lệnh/shell để gọi các trình biên dịch). –

+0

Xin lỗi, tôi đã bỏ lỡ "không" trong câu đó. Đã sửa. –

1

Là giải pháp thay thế, tôi đã thao tác biến đường dẫn khi gọi Rust từ môi trường vỏ Cygwin của mình. Theo cách tôi hiểu, Rust sẽ sử dụng đường dẫn hệ thống, để tìm kiếm gcc, và sau đó thử sử dụng nó. Bằng cách thao tác đường dẫn để loại bỏ GCC không muốn, nó sẽ rơi trở lại, và sử dụng một trong những trình cài đặt rỉ sét đi kèm với.

PATH = '/ c/Program Files/Rust/bin' hàng xây dựng

* Sử dụng các đường Cygwin đúng đến nơi mà bạn cài đặt Rust. Trên hệ thống của tôi, đây là/c/Program ...

+0

Không phải là một ý tưởng tồi. Thật không may khi được slaved vào phiên bản gcc trong Rust, nhưng nó đập phải tái kích hoạt đường dẫn của tôi mỗi lần tôi muốn chuyển đổi giữa phát triển Rust và C/C++. –

Các vấn đề liên quan