3

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

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

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

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

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

4

1 回答 1

4

将我的评论扩展到答案。

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

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

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

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

于 2013-11-12T11:27:02.717 回答