【问题标题】:Unresolved external UrlCombineW未解析的外部 UrlCombineW
【发布时间】:2013-11-23 18:53:05
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您的 CPP 文件中有 #pragma comment(lib, "Shlwapi.lib") 吗?试试看是否有帮助。
  • @DavidM 现在可以帮忙编译了!谢谢。你能把它变成一个答案并解释这个 pragma 到底是做什么的吗?
  • 它指示 C++ 从描述文件 Shlwapi.lib 中加载外部模块信息。该文件包含UrlCombineW 的实现,或者最有可能引用这种实现可以在运行时从Windows 单元ShlWapi.dll 或其他一些实现。您必须阅读手册如何为您的 C++ 编译器创建和使用 DLL。看起来很奇怪,按照常识,如果您没有使用预处理器定义符号制作一些奇特的东西,那么这个 pragma 应该是 shlwapi.h 本身的一部分。 docwiki.embarcadero.com/RADStudio/XE3/en/Pragma_comment
  • #pragma 只是一种方法。通常,您会将 .lib 文件的名称传递给链接器。在项目配置中将有执行此操作的选项。这种方式比#pragma 更受欢迎,因为它将编译器特定的细节保留在源代码之外。
  • 我不使用 C++Builder,但据我所知,您应该使用项目管理器将 .lib 文件添加到项目中。

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


【解决方案1】:

将我的评论扩展到答案。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多