【问题标题】:Using RegOpenKey and RegEnumKey in dynamic QT with MSVC2010使用 MSVC2010 在动态 QT 中使用 RegOpenKey 和 RegEnumKey
【发布时间】:2014-09-30 06:58:29
【问题描述】:

如前所述,我想使用 2 个 winapi 函数进行注册表访问。 我安装了 QT 5.3.2 和 QT Creator 3.2.0、MSVC2010 版本、Windows SDK v7.1 和调试工具。

windows.h 包含在我的项目中,并且可以看到两个函数,但链接器失败

usb_part.obj:-1: error: LNK2019: unresolved external symbol __imp__RegEnumKeyW@16 referenced in function "bool __cdecl GetUsbName(class QString &)" (?GetUsbName@@YA_NAAVQString@@@Z)

usb_part.obj:-1: error: LNK2019: unresolved external symbol __imp__RegOpenKeyW@12 in function "bool __cdecl GetUsbName(class QString &)" (?GetUsbName@@YA_NAAVQString@@@Z)

我想它会尝试动态链接这些函数(因此是“__imp”),如何将其设置为链接到静态 .lib 文件?或者,如果动态构建的 QT 无法做到这一点,我该如何将它们链接到 .dll?


更新: 试过这些:

LIBS += -ladvapi32
LIBS += AdvAPI32.Lib
LIBS += "c:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\AdvAPI32.Lib"

无济于事


UPD2: 问题在于 QT 在更改 .pro 后没有重新创建 makefile。在我删除 makefile 后,LIBS += -ladvapi32 工作正常。以为“清洁项目”可以做到这一点,但事实证明它没有。

【问题讨论】:

    标签: c++ qt winapi linker linker-errors


    【解决方案1】:

    您应该添加到您的 .pro 文件中

    LIBS += -lAdvapi32
    

    或

    LIBS += Advapi32.lib
    

    之后再次运行 qmake 和 build。

    [更新] 可能需要手动删除生成的 makefile 并使用 qmake 重新创建它们再次运行。

    【讨论】:

    • 试过了,不同版本的(比如指定完整路径),仍然没有结果(见更新)
    • 尝试手动删除生成的 makefile,然后通过运行 qmake 重新创建它们...或者您可以尝试手动查找生成的 makefile 中指定的库以不手动删除它们
    • 好的,手动删除 makefile 似乎在这里有所帮助,LIBS += -ladvapi32 现在可以工作了。我只是想知道为什么 QT 不会在“清理项目”中删除它们
    • Qt Creator 区分 qmake 步骤的构建和生成的 makefile 的构建。因为 makefile 是由 qmake 生成的,所以清理不会影响它们,需要从 Qt Creator 构建菜单运行 qmake 来更新 makefile。如果 makefile 没有得到更新(我在 Windows 上也经常遇到这样的问题)它看起来像 qmake 错误。
    猜你喜欢
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    相关资源
    最近更新 更多