获得LNK2001,但智能感知可以找到功能

Getting LNK2001 yet Intellisense Can Find Function

本文关键字:功能 感知 LNK2001 智能 获得      更新时间:2023-10-16

在VS2015中构建项目时,我得到以下链接错误:

LNK2001无法解析的外部符号__imp__PathCombineW@12

函数PathCombineW来自我在头文件中包含的shlwapi.h。我觉得很困惑的部分是智能感知解决这个函数很好,我可以在函数上"偷看定义",它把我带到shlwapi.h中的声明。

如果我尝试使用pathch .h中的任何函数,我也会遇到同样的问题。我最初使用这个API是因为它似乎是较新的首选路径操作API。然而,我得到了完全相同的LNK2001与任何API。

我不知道它是否与我所包含的其他头有关。它们如下:

// daqServiceTray.cpp 
#include "stdafx.h"
#include "daqServiceTray.h"    
#include <Shlwapi.h>
#include <Shellapi.h>
#include <Strsafe.h>

//stdafx.h
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN
#ifndef _UNICODE
#define _UNICODE
#endif
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>

//targetver.h
#pragma once
#define WINVER 0x0601
#define _WIN32_WINNT 0x0601
#include <SDKDDKVer.h>

//dayServiceTray.h
#pragma once
#include "resource.h"

resource .h是UI资源文件的头文件。我正在构建这些到一个win32 GUI应用程序。我在Windows 7上开发。

通过阅读错误帮助我得到的感觉,就像我正在引起一些冲突使用代码从两个不同的平台版本,但我有很多麻烦弄清楚冲突可能是什么。在我尝试进行一些路径操作并添加pathchh或shlwapi.h之前,应用程序正在构建并运行正常。

为什么智能感知可以找到链接器向我大喊一个未解决的外部函数?它找不到函数定义的库吗?我的包的顺序有问题吗?

我的核心问题是双重的:

为什么智能感知能找到函数而链接器却找不到?

如果问题是无法找到函数的定义,我如何了解为我的目标平台(windows 7)编写应用程序需要包含哪些库?我一直有很多麻烦在MSDN上获得这些信息。是否存在某种高级教程或页面来解释不同平台构建规范的细微差别?

为什么智能感知可以找到函数,而链接器不能?

链接器正在寻找.lib文件,智能感知只是使用头文件。要生成一个可执行文件(编译+链接),你需要这两个。

如果问题是无法找到函数的定义,我如何了解为我的目标平台(windows 7)编写应用程序需要包含哪些库?

PathCombine的文档底部有一个漂亮的表,说明函数定义在哪个头文件中,以及链接器需要链接哪个库。

对于PathCombine,表看起来像这样:

<>之前+----------------------------------------------------------------------------------------+|最低支持客户端| Windows 2000 Professional, Windows XP[仅限桌面应用]|+----------------------------------------------------------------------------------------+|最小支持服务器| Windows 2000服务器[仅限桌面应用程序]|+----------------------------------------------------------------------------------------+| Header | Shlwapi.h |+----------------------------------------------------------------------------------------+|图书馆| Shlwapi。自由 |+----------------------------------------------------------------------------------------+| DLL | Shlwapi.dll(4.71或更高版本)|+----------------------------------------------------------------------------------------+| Unicode和ANSI名称| PathCombineW (Unicode)和PathCombineA (ANSI) |+----------------------------------------------------------------------------------------+之前

阅读这张图表告诉我们,要得到这个函数,我们需要使用

#include <Shlwapi.h>

并将Shlwapi.lib添加到链接器的库列表中。它还告诉我们,如果我们想动态调用函数,我们可以调用LoadLibrary并将Shlwapi.dll传递给它,然后使用GetProcAddress来查找PathCombineAPathCombineW函数。