2017-09-14 55 views
0

我試圖建立與cargo build防鏽項目,但我得到這個錯誤:蛻變調用類型的不同大小的

error[E0512]: transmute called with types of different sizes 
    | 
90 |  ::std::mem::transmute(tenv) 
    |  ^^^^^^^^^^^^^^^^^^^^^ 
    | 
    = note: source type: i32 (32 bits) 
    = note: target type: *mut traction::Environment<JNIPlatform<'a>, std::string::String> (64 bits) 

在此休息的代碼是這樣的:

let tenv = env.get_field_unsafe(obj, JFieldID::from(field), jni::signature::JavaType::Primitive(jni::signature::Primitive::Int)).unwrap_alog().i().unwrap(); 
::std::mem::transmute(tenv) 

我對Rust沒有任何認識,所以我只能猜測它的功能。

由於這是一個類型轉換問題,我假設這與我的操作系統有關。其他克隆相同存儲庫的人沒有像這樣的問題(macOS和Windows)。我有macOS Sierra 10.12.6。

另一個問題:transmute如何知道什麼類型來轉換給它的變量? ::std::mem::transmute(tenv)只接受一個參數,那麼它如何知道源類型和目標類型?

回答

1

目標類型是一個指針,所以它的體系結構是特定的:32位平臺上的32位,64位平臺上的64位。 usizeisize可以用於這種情況。

如果不是您的代碼,您應該在原始存儲庫上打開一個問題。

你可以嘗試建立一個32位二進制,使用rustup default stable-i686

how does transmute know what type to convert the variable that's given to it? ::std::mem::transmute(tenv) takes only one argument, so how does it know both the source type and the destination type?

鏽推斷從上下文的源和目標類型,以同樣的方式Iterator::collect一樣。

+0

在代碼中是否有任何快速修復?也許指定某處'64'而不是'32'或反之亦然? – octavian

+0

嘗試構建一個32位二進制文​​件:使用rustup默認的stable-i686。 你當然可以改變:: std :: mem :: transmute(tenv):: std :: mem :: transmute(tenv as i64),但是IDK如果是有效的:D –

+0

運行'rustup默認穩定-i686'導致這個'線程'主'恐慌在'無法找到libclang:'\ libclang \'共享庫無法打開:/usr/local/opt/llvm/lib/libclang.dylib「 – octavian