Open1

Rustビルドエラー expected `SOCKADDR`, found a different `SOCKADDR`

yunayuna

利用しているcrateの依存crate内で、何らかのversion不一致が発生している

error[E0308]: mismatched types
    --> C:\Users\masat\.cargo\registry\src\index.crates.io-6f17d22bba15001f\xenet-socket-0.4.0\src\windows.rs:141:27
     |
93   |         let res = unsafe { windows_sys::Win32::Networking::WinSock::$fn($($arg, )*) };
     |                            -------------------------------------------- arguments to this function are incorrect
...
141  |     syscall!(bind(socket, addr.as_ptr(), addr.len()), PartialEq::ne, 0).map(|_| ())
     |                           ^^^^^^^^^^^^^ expected `SOCKADDR`, found a different `SOCKADDR`

Cargo.lockを調べていったところ、
以下の記述があり、
・socket2 0.5.6は、windows-sys 0.52.0を内部で使っている
・dependenciesの "windows-sys 0.48.0"
これが矛盾するため、コンパイルエラーになっているっぽい

[[package]]
name = "xenet-socket"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcc0d89fb9da3c94ef742af3d27d1119131a7c6a03461bf72ee4560388d1eae8"
dependencies = [
 "async-io 1.13.0",
 "socket2 0.5.6",
 "windows-sys 0.48.0",
 "xenet-packet",
]

https://github.com/rust-lang/socket2/blob/faa59e97451273e2b60963bfccec2966adfd59d0/Cargo.toml

[target.'cfg(windows)'.dependencies.windows-sys]
version = "0.52"
features = [
  "Win32_Foundation",
  "Win32_Networking_WinSock",
  "Win32_System_IO",
  "Win32_System_Threading",
  "Win32_System_WindowsProgramming",
]

通常は、上記のような問題が発生しないよう、
socket2をdependenciesに追加する場合、
socket2が利用するwindows-sysのバージョンを明示的に書かなければならないっぽい。
例↓
https://github.com/keeperofdakeys/dns-lookup/blob/d77ad11d584b41f5dbed487ab4410bb026834c60/Cargo.toml

[dependencies]
socket2 = "^0.5.2"
cfg-if = "^1.0"

# Note that version of windows-sys is pinned to version used in socket2 release
# due to use of shared variables like SOCKADDR.
[target."cfg(windows)".dependencies.windows-sys]
version = "^0.48"
features = ["Win32_Networking_WinSock", "Win32_Foundation"]