This question already has answers here:
What is an undefined reference/unresolved external symbol error and how do I fix it?

(34个答案)


5年前关闭。




在VS2015中构建项目时,出现以下链接错误:



函数PathCombineW来自shlwapi.h,我将其包含在标题中。我觉得很困惑的部分是Intellisense很好地解析了此函数,我可以在该函数上“窥视定义”,并直接进入shlwapi.h中的声明。

如果尝试使用pathcch.h中的任何功能,我将遇到相同的确切问题。我最初使用此API是因为它似乎是更新的首选路径操作API。但是,无论使用哪种API,我都会得到完全相同的LNK2001。

我不知道这是否与我包含的其他 header 有关。它们在下面列出:

// 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上进行开发。

仔细阅读错误帮助,我会觉得使用两个不同平台版本的代码会引起一些冲突,但是我在弄清楚到底是什么冲突时遇到了很多麻烦。在尝试进行一些路径操作并添加pathcch.h或shlwapi.h之前,该应用程序正在构建并运行正常。

为什么Intellisense可以通过链接器对未解决的外部对象大喊大叫?找不到函数定义的库吗?我的订单是否包含问题?

我的核心问题是双重的:

智能感知如何找到功能但链接器找不到?

如果问题是找不到函数的定义,我如何得知要为目标平台(Windows 7)编写应用程序需要包括哪些库?我在获取有关MSDN上的信息时遇到了很多麻烦。是否有某种高级教程或页面来说明不同平台的构建规范的细微差别?

最佳答案



链接器在寻找.lib文件,IntelliSense仅在使用 header 。要生成可执行文件(编译+链接),您需要两者兼有。



PathCombine 的文档的底部有一个漂亮的表,其中列出了定义该函数的 header 以及链接器链接该函数所需的库。

对于PathCombine,表如下所示:

+----------------------------------------------------------------------------------------+
| Minimum supported client  |  Windows 2000 Professional, Windows XP [desktop apps only] |
+----------------------------------------------------------------------------------------+
| Minimum supported server  |  Windows 2000 Server [desktop apps only]                   |
+----------------------------------------------------------------------------------------+
| Header                    |  Shlwapi.h                                                 |
+----------------------------------------------------------------------------------------+
| Library                   |  Shlwapi.lib                                               |
+----------------------------------------------------------------------------------------+
| DLL                       |  Shlwapi.dll (version 4.71 or later)                       |
+----------------------------------------------------------------------------------------+
| Unicode and ANSI names    |  PathCombineW (Unicode) and PathCombineA (ANSI)            |
+----------------------------------------------------------------------------------------+

Reading this chart tells us that to get this function we'd want to use

#include <Shlwapi.h>

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

10-08 20:02