未解析的外部UrlCombineW

时间:2013-11-11 20:32:36

标签: delphi linker linker-errors c++builder unresolved-external

我有一个看起来像这样的文件:

#include <Shlwapi.h>
...
void SomeFunction()
{
UrlCombineW(...)
}

这个编译得很好,直到我在C ++ Builder IDE中安装了另一个Delphi组件,但现在为UrlCombineW报告未解析的外部组件。在安装此组件之前,上述调用很正常。

组件似乎以某种方式覆盖了这个,所以我需要明确地告诉编译器在哪里寻找UrlCombineW。这是Shlwapi.dll的函数。

编译器没有抱怨,但是我如何明确地告诉链接器在哪里寻找这个函数并避免未解决的外部错误?

1 个答案:

答案 0 :(得分:4)

将我的评论扩展到答案。

您需要链接到Shlwapi.lib,以便链接器找到这些功能。 (这个解释掩盖了一些内容,但.lib,一个库文件,可以是staticimport库。静态库包含函数本身 - 它基本上是一个集合捆绑在一起的.obj文件;导入库说在特定的DLL中可以找到函数X,Y和Z.)无论哪种方式,如果你链接.lib,你将得到你需要的函数。

有几种方法可以告诉链接器链接到文件中:

  • 在某个地方的.cpp文件中使用#pragma comment(lib, "Filename.lib")。对于您的情况,这是#pragma comment(lib, "Shlwapi.lib")
  • 将其添加到项目选项,然后将其添加到链接器命令行。在C ++ Builder中,您可以通过将.lib文件实际添加到项目中来完成此操作,即将其拖放到项目管理器中的项目中,或使用文件&gt;添加到项目。

您更喜欢哪个取决于您。我倾向于在本地链接到本地​​化的东西 - 所以在我的代码中,只有一个单元使用Shlwapi.h,事实上它是一个隐藏在外部的实现细节,它没有显示在界面中。因此,在该文件中,我在包含标题的位置使用#pragma comment进行链接。另一方面,如果你有更广泛使用的东西 - 选择最广泛的例子,kernel32.lib - 我会添加项目本身。 (注意这是一个例子,你实际上并不需要显式链接到kernel32,这将为你完成!)