【发布时间】: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