Связать User32 с gcc - PullRequest
       19

Связать User32 с gcc

2 голосов
/ 04 апреля 2010

У меня есть программа на C, у которой есть вызов функции, определенный в windows.h (который я включил), однако, когда я пытаюсь скомпилировать ее с gcc, я получаю ошибку:

warning: implicit declaration of function `LockWorkStation'

Я посмотрел документацию MSDN и увидел, что эта функция - файл библиотеки User32, и мне было интересно, как мне связать это с моим файлом.

Ответы [ 2 ]

4 голосов
/ 04 апреля 2010

LockWorkstation доступен в Windows 2000 и выше.Вы должны объявить версию Windows, на которую вы ориентируетесь.Сделайте так, чтобы это выглядело так:

#define _WIN32_WINNT 0x500
#include <windows.h>
2 голосов
/ 04 апреля 2010

У меня такая же проблема с gcc - но это не ошибка компоновщика. Сообщение означает, что в winuser.h нет прототипа для функции, или, точнее, компилятор не может найти такой прототип. Это потому, что соответствующий бит winuser.h выглядит так:

#if (_WIN32_WINNT >= 0x0500)
WINUSERAPI BOOL WINAPI LockWorkStation(void);
#endif

Другими словами, вам нужна версия Windows> = 5 (т.е. Win2K), чтобы использовать эту функцию. В настоящее время я пытаюсь это на Win2K, и это не работает, что указывает на то, что макрос установлен неправильно. В настоящее время я мало занимаюсь «настоящим» программированием для Windows, поэтому не уверен, почему так должно быть.

Редактировать: Фактически, небольшой эксперимент показывает, что gcc считает, что версия Windows 2000 для Windows (по крайней мере, в моей установке) - 0x0400.

Далее: На самом деле макрос _WIN32_WINNT является (как следует из подчеркивания в начале) зарезервированным именем в C и C ++ и не должен определяться в коде пользователя. Определение макроса WINVER, похоже, имеет тот же эффект и является (по крайней мере, концептуально) более переносимым. Этот код компилируется на моей установке gcc:

#define WINVER 0x0500
#include <windows.h>
int main() {
    LockWorkStation();
}
...