将另一个DLL链接到项目后,无法加载c++ DLL

C++ DLL fails to load after linking another DLL to project

本文关键字:DLL 加载 c++ 项目 另一个 链接      更新时间:2023-10-16

我使用Visual Studio 2010创建一个32位DLL作为第三方应用程序(AviSynth)的插件。DLL被第三方应用程序正确加载,直到我尝试使用FFTW (http://fftw.org) DLL。我使用了32位的FFTW DLL,运行"lib/def:libfftw3-3.def"来创建一个.lib文件,并将其添加为项目中的资源。对函数进行了一些调用。它编译得很好,但是当我尝试在第三方工具中加载它时,它失败了。

我试过把FFTW DLL放在我的DLL旁边,我也试过从我的DllMain里面使用LoadLibrary,但它仍然不起作用。

我能够在DllMain函数和AviSynth (AvisynthPluginInit2)调用的函数中停止调试器,但AviSynth声称无法在此之后加载DLL,并且之前调用的函数顶部的断点不再被击中。

AviSynth错误信息是:LoadPlugin:无法加载"C:Program Files (x86)AviSynth 2.5pluginsxxxMYPLUGINxxx.dll"

谢谢你的帮助。

当我得到类似这样的东西时,我尝试的第一件事是Dependency Walker:

http://www.dependencywalker.com/

它不会捕获所有可能的问题,但它可以非常快速地检查简单的问题(丢失dll,丢失导出)。您还可以将其设置为通过双击打开任意数量的文件扩展名。我通常设置.dll, .ax, .ocx, .sys, .exe。

IMO 任何Windows开发人员必不可少的工具之一。

ps:如果Dependency Walker没有发现任何问题,尝试用LoadLibrary()加载你的 DLL,看看GetLastError()返回什么。


顺便说一句:

和我也尝试使用LoadLibrary从我的DllMain内,但它仍然不工作。

不能从DllMain()呼叫LoadLibrary()

入口点函数应该只执行简单的初始化或终止任务。它不能调用LoadLibrary或LoadLibraryEx函数(或调用这些函数的函数),因为这可能会在DLL加载顺序中创建依赖循环。

(入口点函数是您的DllMain)

结果是FFTW DLL必须与AVS脚本在同一目录中,而不是AVISynth插件目录。我猜那是Virtual Dub的工作目录。

不管怎样,它现在工作了。谢谢你的帮助!