【问题标题】:How to resolve linking error for GetSystemMetrics()?如何解决 GetSystemMetrics() 的链接错误?
【发布时间】:2009-12-10 17:14:46
【问题描述】:

我正在尝试使用以下方法来获取主显示屏的高度和宽度:

#include <winuser.h>
size_t width = (size_t)GetSystemMetrics(SM_CXBORDER);
size_t height = (size_t)GetSystemMetrics(SM_CYBORDER);

但是,它因未解决的外部链接错误 (LNK1120) 而失败。我尝试链接到 user32.lib(如文档中的 here),并收到相同的错误,以及链接到 wmbase.lib(如文档中的 here),并收到 wmbase.lib 不存在的错误!我做错了什么?

请注意,我只使用普通的 C,而不是 C++。这是获取主显示器屏幕分辨率(以像素为单位)的正确函数吗?

我目前正在尝试在 MSVC 上编译它,但更喜欢可移植到其他编译器的解决方案。

谢谢。

编辑

所以看起来我正在寻找的参数是SM_CXSCREENSM_CYSCREEN,而不是SM_CXBORDERSM_CYBORDER。但是,我仍然无法编译。

如果澄清了任何事情(当链接到 user32.lib 时),这是实际错误:

screen.obj : error LNK2019: unresolved external symbol __imp__GetSystemMetrics@4 referenced in function _getMainDisplaySize
build\lib.win32-2.6\foomodule\bitmap.pyd : fatal error LNK1120: 1 unresolved externals
error: command '"C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\link.exe"' failed with exit status 1120

(我正在尝试编译 Python/C 模块,这就是为什么你会看到奇怪的目录)

【问题讨论】:

  • 如果您提供来自链接器以及链接器命令行的实际错误文本,我们或许能够诊断出来。
  • wmbase.lib 不存在,因为它被用于嵌入式/移动开发的 Windows CE 使用。

标签: c windows visual-c++ getsystemmetrics


【解决方案1】:

您想要#include &lt;windows.h&gt; 而不是&lt;winuser.h&gt;。照原样,它可能使原型上的某些修饰符错误。

编辑:既然你仍然有问题,也许我们可以从一个简化的测试开始,看看你得到了什么。幸运的是,GetSystemMetrics() 不需要窗口句柄或任何东西,因此 e 可以从简单的控制台应用程序中调用它:

#include <windows.h>
#include <iostream>

int main() { 
    size_t width = (size_t)GetSystemMetrics(SM_CXSCREEN);
    size_t height = (size_t)GetSystemMetrics(SM_CYSCREEN);

    std::cout << "width = " << width << "\n";
    std::cout << "height = " << height << std::endl; 
    return 0;
}

这是编译和运行它的屏幕转储:

D:\C\source>cl screen_res.cpp user32.lib
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

screen_res.cpp
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:screen_res.exe
screen_res.obj
user32.lib

D:\C\source>screen_res
width = 1600
height = 1200

如果这不能编译和运行,您的安装可能有问题。如果是这样,那么问题可能出在您正在处理的项目中。

【讨论】:

  • 谢谢。看起来我只是使用错误的标志来添加库(或者 Python 的 distutils 的“库”选项没有添加正确的标志,需要使用“extra_link_args”选项显式添加)。
  • 我遇到了类似的错误,但这是因为我没有在我的 nmake 命令行上显式链接 user32.lib。感谢您的提示!
【解决方案2】:

解决方案是在您的一个模块中定义 COMPILE_MULTIMON_STUBS。

#define COMPILE_MULTIMON_STUBS
#include <multimon.h>

【讨论】:

  • 对我来说完全相反 - 在我注释掉 #include &lt;multimon.h&gt;_xGetSystemMetrics@4 变成 __imp__GetSystemMetrics@4 并且链接成功。
【解决方案3】:

这对您的链接错误没有帮助,但是您也质疑这是否是获取显示尺寸的正确方法。您传递给 GetSystemMetrics 的参数不会返回您想要的。检查documentation 上的可用标志。还可以考虑使用SystemParametersInfo。使用哪个调用取决于您要查找的确切内容的上下文 - 监视器大小与工作区等。

【讨论】:

    猜你喜欢
    • 2010-11-01
    • 2011-05-25
    • 2011-10-17
    • 1970-01-01
    • 2015-07-21
    • 2014-01-10
    • 2011-07-25
    • 2010-12-31
    相关资源
    最近更新 更多