【问题标题】:Link User32 with gcc将 User32 与 gcc 链接
【发布时间】:2010-04-04 18:38:49
【问题描述】:

我有一个 C 程序,它有一个在 windows.h(我已经包含在内)中定义的函数调用,但是,当我尝试使用 gcc 编译它时,我得到了错误:

warning: implicit declaration of function `LockWorkStation'

我查看了 MSDN 文档,发现这个函数是 User32 库文件,我想知道如何将它链接到我的文件。

【问题讨论】:

    标签: c windows gcc linker


    【解决方案1】:

    LockWorkstation 适用于 Windows 2000 及更高版本。您必须声明您所针对的 Windows 版本。让它看起来像这样:

    #define _WIN32_WINNT 0x500
    #include <windows.h>
    

    【讨论】:

      【解决方案2】:

      我对 gcc 有同样的问题 - 但这不是链接器错误。该消息意味着在 winuser.h 中没有该函数的原型,或者更准确地说,编译器找不到这样的原型。那是因为 winuser.h 的相关位看起来像这样:

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

      换句话说,您需要 Windows >= 5 的版本(即 Win2K)才能使用此功能。我目前正在 Win2K 上尝试这个,但它不起作用,这表明宏没有正确设置。这些天我没有做太多“真正的”Windows 编程,所以我不确定为什么会这样。

      编辑:事实上,一点实验表明 gcc 认为 Win2K 的 Windows 版本(至少在我的安装上)是 0x0400。

      进一步: 实际上,宏 _WIN32_WINNT 是(正如前导下划线所暗示的)C 和 C++ 中的保留名称,不应在用户代码中定义。定义宏WINVER 似乎具有相同的效果,并且(至少在概念上)更便携。此代码在我的 gcc 安装上编译:

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

      【讨论】:

      • Windows 上的编译器默认最大化输出的可移植性,而不是针对当前平台进行优化。所以 gcc 不会错误地认为 Win2k 是 0x0400,而是假定您想要生成可以在 WinNT 4.0 或 Win95 上运行的代码,除非您另有说明。
      • @Neil: 设置 WINVER 比设置 _WIN32_WINNT 更可取是绝对正确的,尽管在某些情况下两者都必须设置(例如,对于 WinNT 4.0 中可用但 Win9x 中没有的功能,你必须使用_WIN32_WINNT)。由于 WINVER = 0x0500,所有 Windows SKU 都是基于 NT 的,因此 WINVER 就足够了。您的回答仍然表明 WINVER 是从托管编译器的 Windows 版本中自动检测到的,这是不正确的。
      • @Ben 考虑一下,some 版本的 Windows 被假定,这似乎是错误的。 WINVER(或其他)未定义似乎是明智的,因为它会导致编译错误 - 不难安排 - 迫使您指定所需的兼容性级别。我当然不是特别想与 NT4 兼容。但是感谢您提供非常有用的信息!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 2010-12-28
      相关资源
      最近更新 更多