所以,我有一个有趣的问题。我正在使用一组专有的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标志链接时,我会得到这些错误(当然主要删除了)。我认为它与以下事实有关:默认情况下,g ++会尝试从dll导入所有符号。我不明白的是为什么这会发生在dll vs可执行文件中。我将尝试使用GetProcAddress()。谢谢!
答案 0 :(得分:2)
它应该像您认为的那样容易。
例如: 你的DLL代码需要:
void doStuff()
{
3rdparty.login();
3rdparty.dostuff();
3rdparty.logoff();
};
到目前为止 - 非常好,你已经包含了正确的标题....(如果你有它们,如果你没有,那么你需要使用LoadLibrary()导入库,然后创建一个函数指针到每个使用GetProcAddress()导出dll入口点,然后调用该函数指针)
然后您与第三方lib链接,就是这样。有时您必须使用'extern“C”'包装定义,以便使链接名称错误更正。
正如你所说,你正在使用g ++,你不能与__declspec(dllimport)混淆,这是一个MS VC扩展。
答案 1 :(得分:0)
“编译”告诉我你是从错误的一端接近这个。您的DLL不应导出自己的包装函数,而是直接引用其他DLL的导出。
E.g。在Windows Kernel32.DEF文件中,存在以下转发:
EXPORTS ... HeapAlloc = NTDLL.RtlAllocHeap
没有HeapAlloc功能的代码。