Неопределенная ссылка на функцию, даже если она должна быть достижимой

#winapi #rust

#winapi #Ржавчина

Вопрос:

Сообщение об ошибке:

 error: linking with `x86_64-w64-mingw32-gcc` failed: exit code: 1
  |
<a lot of paths and args>
C:UserswiktoIdeaProjectstest/src/main.rs:297: undefined reference to `WaitForDebugEventEx'
  

Часть main.rs , Я могу поделиться остальным, если понадобится.

 mod winapi;
use winapi::*;

unsafe fn debug_loop(amp;mut self, process_id: DWORD) {
    let mut continue_status = DBG_CONTINUE;
    let mut debug_event = std::mem::zeroed::<DEBUG_EVENT>();
    let debug_event = amp;mut debug_event;
    while WaitForDebugEventEx(debug_event, INFINITE) != 0 {
        //something
    }
}
  

Часть winapi.rs

 #[link(name = "Kernel32")]
extern "C" {
    pub fn WaitForDebugEventEx(
        lpDebugEvent: *mut DEBUG_EVENT,
        dwMilliseconds: DWORD,
    ) -> BOOL;
}
  

Есть ли что-то, что я делаю неправильно, или, может быть, это проблема с mingw32-gcc?

Комментарии:

1. Попробуйте использовать extern "stdcall" или extern "system" вместо extern "C" .

2. WaitForDebugEventEx был представлен в Windows 10. Установлен ли и правильно ли настроен Windows 10 SDK, чтобы компоновщик мог обнаруживать библиотеки импорта? 32-разрядные сборки MinGW, как правило, безнадежно устарели.

3. @IInspectable Да, согласно установщику VS, у меня установлен Win10 SDK 10.0.19041.0. Еще одна информация, которая может быть полезной, заключается в том, что при переходе WaitForDebugEventEx к WaitForDebugEvent правильной сборке программы. «правильно настроен» — я не уверен в этом, я только что установил его через установщик VS

4. Если WaitForDebugEvent она правильно разрешена, то это явный признак того, что компоновщик извлекает kernel32.lib из SDK до Windows 10. Вы можете использовать такой инструмент, как Process Monitor , чтобы узнать, откуда извлекается kernel32.lib , и извлечь его оттуда.