即使包含在内,Qt 也无法打开 shell32.lib

Qt fails to open shell32.lib even when included

我有一个使用 MSVC2013 64 位编译的 QT 5.4 项目抛出链接器错误 LNK1104: 无法打开文件 'shell32.lib'。 Windows 上的每个 Qt Widgets 应用程序都需要这个库。

无论是否指定了该库的路径,都会抛出此错误,并且 如果我包含其他一些库,我不会收到该库的错误消息,这让我相信 Qt Creator 会自动在 .pro 文件以外的指定位置寻找 shell32。

.pro 文件如下所示。

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = test
TEMPLATE = app


SOURCES += main.cpp\
    mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

win32:CONFIG(release, debug|release): LIBS += $$quote(C:/Program Files             (x86)/Microsoft SDKs/Windows/v7.1A/Lib/shell32.lib)
else:win32:CONFIG(debug, debug|release): LIBS += $$quote(C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Lib/shell32.lib)

INCLUDEPATH += $$quote(C:/Program Files (x86)/Microsoft   SDKs/Windows/v7.1A/Include)
DEPENDPATH += $$quote(C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Include)

不确定这是否相关,但 shell32.lib 是 qmake.conf 中 QMAKE_LIBS_CORE 变量下列出的库之一。

解决方案

在左侧窗格的“项目”选项卡中,将所需的库路径添加到 LIB 变量,并将 SC.exe(也在 Windows SDK 中)的路径添加到 PATH 变量。后者是必要的,否则你会得到 "LNK 1158: can't execute rc.exe." 显然我的 .pro 中的 LIBS += 语句不起作用,尽管 INCLUDEPATH += 起作用(删除后我得到 "can't find windows.h")。

我不知道为什么 LIBS+= 不起作用或者为什么我还需要 RC.exe 的路径(我从来不需要使用 Visual Studio 添加它),但至少在那里是一个解决方案。

我找到了解决办法。打开左窗格中的“项目”选项卡,然后:

  1. 将所有需要的库路径添加到 LIB 变量
  2. 将 sc.exe 的路径(在 Windows SDK/bin 文件夹中)添加到 PATH
  3. 重建。

所以显然将 LIBS += 放在 .pro 文件中在我的 Qt 中不起作用,尽管 headers 的 INCLUDEPATH+= 可以。好吧。

像这样使用它

win32:CONFIG(release, debug|release): LIBS += -L$$quote(C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Lib/) -lshell32
else:win32:CONFIG(debug, debug|release): LIBS += -L$$quote(C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Lib/) -lshell32

INCLUDEPATH += $$quote(C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Include)
DEPENDPATH += $$quote(C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Include)

确保 运行 qmake 在对 .pro 文件进行更改后

这可以通过右键单击左侧面板中的项目自动生成 然后 select 菜单项 "Add Library"

然后select"External Library"

然后 select windows 的静态库并浏览到 select shell32.lib 的路径并包含文件夹

再次确保在编译这个项目之前运行 qmake

这可以在项目菜单中找到。与您找到 "Add Library" 选项的菜单相同

Visual Studio 默认安装不包括桌面应用程序: