无法编译访问另一个 dll 的 dll
Posted
技术标签:
【中文标题】无法编译访问另一个 dll 的 dll【英文标题】:Trouble compiling dll that accesses another dll 【发布时间】:2009-03-23 23:12:25 【问题描述】:所以,我有一个有趣的问题。我正在使用一组专有的 dll,我显然没有源代码。目标是编写一个中间 dll,将来自专有 dll 的大量函数调用组合在一起。使用 g++ 编译时,我遇到的问题是原始 dll 出现以下错误: 无法导出 libname_NULL_THUNK_DATA。未找到符号。
如果我添加一个 main 并编译为可执行文件,一切都会按预期工作。我正在使用 mingw 进行编译。感谢您的帮助。
对于第一个回复:要么我对你在说什么感到困惑,要么我没有很好地表达我的问题。我没有明确地试图从我的包装器中导出任何东西,我只是从他们的 dll 中调用函数。问题是我收到错误,它无法将这些特定符号从 dll 导出到我的包装器。问题是我什至不完全确定这些 _NULL_THUNK_DATA 符号的用途。我进行了搜索并在某个地方阅读了它们不应该导出的内容,因为它们是 Windows 使用的内部符号。我曾尝试对链接器使用 --exclude-symbols 指令,但它似乎没有做任何事情。如果我完全误解了你想说的话,我深表歉意。
所以,我认为我的问题与此有关。当仅编译使用 dll 的标准可执行文件时,我能够包含标头并直接调用函数,例如:
#include :3rdparty.h
int main()
dostuff(); // a function in the 3rdparty.dll
这将编译并运行良好。我只需要在 g++ 命令中链接库。 当与 -shared 标志链接时,我会收到这些错误(当然删除了 main )。我认为这与默认情况下 g++ 尝试从 dll 导入所有符号的事实有关。我不明白为什么会在 dll 和可执行文件中发生这种情况。我将尝试使用 GetProcAddress()。谢谢!
【问题讨论】:
【参考方案1】:它应该像你想象的那样简单。
例如: 您的 dll 代码需要:
void doStuff()
3rdparty.login();
3rdparty.dostuff();
3rdparty.logoff();
;
到目前为止 - 太好了,您已经包含了正确的标题 ....(如果有,如果没有,则需要使用 LoadLibrary() 导入库,然后为每个文件创建一个函数指针使用 GetProcAddress() 导出 dll 入口点,然后调用该函数指针)
然后你链接到第 3 方库,就是这样。有时,您必须使用“extern "C"' 来包装定义,以便正确处理链接名称。
正如您所说,您使用的是 g++,您不会与 __declspec(dllimport) 混淆,它是一个 MS VC 扩展。
【讨论】:
【参考方案2】:“编译”告诉我你从错误的一端接近这个。您的 DLL 不应导出自己的包装函数,而应直接引用其他 DLL 的导出。
例如在 Windows Kernel32.DEF 文件中,存在以下转发:
出口 ... HeapAlloc = NTDLL.RtlAllocHeap没有 HeapAlloc 函数的代码。
【讨论】:
以上是关于无法编译访问另一个 dll 的 dll的主要内容,如果未能解决你的问题,请参考以下文章
C# 我定义了一个静态类编译成DLL后,在另一个项目中引用这个DLL,但访问不了里面的成员