【发布时间】:2020-05-09 19:29:43
【问题描述】:
我正在修改我的应用程序,以便它可以显式加载 DLL(通过 Windows API)并从 DLL 调用一些函数。但我也需要能够从 DLL 中调用一些应用程序的函数。我只能将函数的头文件提供给 DLL。但我收到 LNK2019 'unresolved external symbol' 错误。
我的想法可行吗?
【问题讨论】:
-
你能澄清一下吗?您的 exe 是否需要对 DLL 进行任何 隐式 加载(即,它是否需要依赖于链接时间)?如果没有,那么您实际上可以使用 exe 'like' 一个 DLL 并将相关函数导出到 DLL(这将从 EXE 导入它们)。我想。
-
好的,如果您的 DLL 编译时使用了相关的头文件(对于 EXE 定义的函数),那么这些函数在 EXE 版本中需要为
dll(export),在 DLL 版本中为dll(import)。要解决链接器错误,您需要将 EXE 的“导出库”添加到 DLL 构建的输入中。我只将它用于 MFC 扩展 DLL,并且它们的加载/分辨率有点不同,所以不能 100% 确定这是可行的。 (如果我向合唱团讲道,请在这里道歉!) -
另一种方法是在 DLL 中包含函数指针和虚拟“存根”函数,然后让 EXE 在成功调用 LoadLibrary 后将其真实函数地址发送到 DLL(但如果你有很多这样的功能)。
-
对于 DLL 项目,VS 会自动生成一个导入库(将其称为导入或导出有点语义 - 取决于您的 POV)。对于 EXE 项目,您必须明确告诉链接器这样做:项目->属性->链接器->高级并指定导入库的位置/名称。您的 DLL 需要与此相关联(在其额外的输入库中,或在代码中的某处使用
#pragma comment(...)。 -
@Adrian Mole ,我有导出符号的 .exe 项目,并且不需要在项目设置中命名 .lib 文件(我在发表此评论之前检查了一个这样的项目),它已生成与使用 __declspec(dllexport) 的任何二进制文件一样。我没有尝试过使用 .def 或命令行导出的项目,但不希望它们有任何不同。