c – 无法编译访问另一个dll的DLL

所以,我有一个有趣的问题.我正在使用一组专有的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().谢谢!

最佳答案 它应该像你想象的那样容易.

例如:
你的DLL代码需要:

void doStuff()
{
  3rdparty.login();
  3rdparty.dostuff();
  3rdparty.logoff();
};

到目前为止 – 非常好,你已经包含了正确的标题….(如果你有它们,如果你没有,那么你需要使用LoadLibrary()导入库,然后创建一个指向每个导出的dll入口点的函数指针使用GetProcAddress()然后调用该函数指针)

然后,您与第三方lib链接,就是这样.有时您必须使用’extern“C”’来包装定义,以便使链接名称更正确.

如你所说,你正在使用g,你不能与__declspec(dllimport)混淆,这是一个MS VC扩展.

点赞