如何在Visual Studio中使用C++ shlwapi库?

5

我想编写一个简单的程序,通过文件扩展名对文件进行分类,但是当我尝试编译时出现了错误。

严重性 代码 描述 项目 文件 行 错误 LNK2019 无法解析的外部符号__imp__PathFileExistsW@4,该符号在函数"void __cdecl classifyFiles(void)" (?classifyFiles@@YAXXZ)中被引用

我的代码调用PathFileExists的位置如下:

void classifyFiles() {
    for (int i = 0; i < files.max_size(); i++) {
        //if each folder doesn't exist, create folder
        LPCWSTR folderName = (L"\\" + extensions.at(i)).c_str();
        if (!PathFileExistsW(folderName)) {
            CreateDirectory(folderName, NULL);
        };
        LPCWSTR destination = (extensions.at(i) + files.at(i)).c_str();
        //move file
        MoveFile(files.at(i).c_str(), destination);
    }
}

我查了一下,似乎仅仅包含 Shlwapi.h 头文件还不够,需要链接库文件。但我找不到如何在 Visual Studio 中实现的答案。
注意:由于这是我第一次使用 Visual Studio,我也无法找到每个菜单和所有内容的位置,请明确说明在哪里找到什么,并如果可能,请包含截图。
参考文献:https://msdn.microsoft.com/en-us/library/windows/desktop/bb773584(v=vs.85).aspx

请参见此问题 - meJustAndrew
1
#pragma指令是向链接器传递设置的一种方式。如何使用IDE指定链接器设置在IDE手册中有详细说明。 - IInspectable
@IInspectable 我讨厌微软的文章。我尝试阅读了几篇,但没有解决我的问题,特别是因为它们在某些时候不太精确,而其他一些SO答案则很明确(我创建了一个新项目并工作了,问题是我“不小心”删除了一些文件)。我不知道在哪里找到VS的手册,即使我找到了,我也不知道如何查找我要找的内容,因为直到昨天我才知道链接器是什么(我仍然不完全理解)。PS:请停止仇恨,否则我将被禁止在SO上提问更长时间。 - Carlos
PathFileExists:"Library: Shlwapi.lib"。链接器文档以及如何使用IDE设置项目:.Lib Files as Linker Input - IInspectable
显示剩余3条评论
3个回答

11
将shlwapi.lib添加到您的依赖列表中:
配置属性 -> 链接器 -> 输入 -> 附加依赖项

4

为了成功构建,我做了两件事情:
在包含(include)后面添加以下代码:
#pragma comment(lib, "Shlwapi.lib")
在我的具体情况下,改变以下代码的行有所不同,出于某种原因,即使它们是相同的。更改:

if (!PathFileExistsW(folderName))

To:

if (PathFileExistsW(folderName) == FALSE)

由于某些原因,使用PathFileExists的值作为第一个输出会导致链接错误,即使其他一切都正常。第二天我再次测试,两种方式都可以工作。也许是我的想象,并且犯了一些错误。


1
实际上,您总是想与FALSE进行比较,因为假条件始终为0(而FALSE是常量0)。真条件可以是任何非零值,并且可能不一定是TRUE(它是常量1)。您所说的“错误”的原始代码实际上很好,并且是惯用的C ++。 - Cody Gray
那么,仅仅改变了那一行代码就能够构建代码,这是非常奇怪的。 - Carlos
代码中不需要加上== FALSE。使用!运算符即可(至少在VS2013中是这样)。不确定你的代码出了什么问题 :) - newlog
@Carlos 我也遇到了同样的问题,只有添加 #pragma 才能成功构建。然后我发现构建错误实际上来自另一个测试项目,而不是我添加库依赖的项目。供您参考。 - Houcheng
在我的情况下,这些并不足够,必须手动将其添加到链接器依赖项中... - rogerdpack
显示剩余7条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接