2015-10-13 51 views
0

在VS2015建设项目时,我得到以下链接错误:获得LNK2001智能感知可以找到功能

LNK2001解析的外部符号__imp__PathCombineW @ 12

功能PathCombineW是SHLWAPI。小时,我已经包含在我的标题中。我觉得这部分令人困惑的是,Intellisense解析了这个函数就好了,我可以在函数中“窥探定义”,并且它在shlwapi.h中声明了我的权利。

如果我尝试使用pathcch.h中的任何函数,我都有同样的确切问题。我最初使用这个API,因为它似乎是更新的,首选的路径操作API。不过,我可以通过API获得与LNK2001完全相同的结果。

我无法弄清楚它是否与我包含的其他头文件有关。他们被列在下面:

// 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上获取这些信息时遇到了很多麻烦。是否有某种高级教程或页面解释了不同平台的构建规范的细微差别?

+0

在C头文件中声明函数与链接时链接它不同。它们是构建过程的两个独立步骤,都是正确编译所必需的。但是,IntelliSense很可能只使用头文件(如果不是它自己的函数签名目录),因为这是存储类型信息的地方。我不知道它究竟是怎么回事,但我确实知道它不需要链接器信息来完成它的工作。 – andlabs

+0

智能感知只需要声明。链接器需要一个定义。我没有看到任何令人困惑的东西,这就是这些工具的工作原理。要修复此问题,请链接到Shlwapi.lib,如[PathCombine](https://msdn.microsoft.com/en-us/library/windows/desktop/bb773571.aspx)中所述。 – IInspectable

+0

至于在MSDN上寻找链接信息,该信息位于涵盖函数的每个页面的底部。有一张整洁的桌子;该表的第一行显示“最低支持客户端”。 “图书馆”行说明你需要链接的图书馆。这总是以“somename.lib”的形式出现。我不使用Visual Studio,所以我不知道如何将库添加到链接库的列表中,但是请检查您的项目属性。 – andlabs

回答

4

智能感知如何找到函数但链接程序不能?

链接器正在寻找.lib文件,IntelliSense只是使用标题。要生成一个可执行文件(编译+链接),你需要两个。

如果问题是无法找到该函数的定义,那么如何才能知道哪些库需要包含在为我的目标平台(Windows 7)编写应用程序中?

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

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)   | 
+----------------------------------------------------------------------------------------+ 

阅读这张图表告诉我们,为了得到这个功能,我们想使用

#include <Shlwapi.h> 

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

+0

Nitpicking:为了编译,声明(头文件)就足够了。链接器需要定义或参考,以填补空白。 – IInspectable

+0

@IInspectable - 值得一提的点。更新为更具体。 (我很欣赏挑剔,它使答案更好。) – theB