How to check for DLL dependency?
Asked Answered
B

12

275

Sometimes when I'm doing a little project I'm not careful enough and accidentally add a dependency for a DLL that I am not aware of. When I ship this program to a friend or other people, "it doesn't work" because "some DLL" is missing. This is of course because the program can find the DLL on my system, but not on theirs.

Is there a way to scan an executable for DLL dependencies or execute the program in a "clean" DLL-free environment for testing to prevent these oops situations?

Bedrock answered 11/9, 2011 at 14:44 Comment(5)
The debugger shows every DLL that gets loaded in the Output window. The Debug + Windows + Modules shows a list of them. Be sure that you can account for all of them. And test your installer like you test your code, use a VM.Ahola
@Hans Passant: Can I find a full list of standard windows DLL's somewhere?Bedrock
Yup, in c:\windows\system32 with a Microsoft copyright.Ahola
@Bedrock - You might also try dumpbin /dependents <program>. I'm guessing the list will be more relevant than listing all DLLs in %SYSTEM% or %SYSTEM32%. Also see DUMPBIN Options on MSDN.Foetor
Check [SO]: Discover missing module using command-line ("DLL load failed" error) (@CristiFati's answer) for a comprehensive answer (console oriented).Biafra
M
333

dumpbin from Visual Studio tools (VC\bin folder) can help here:

dumpbin /dependents your_dll_file.dll
Menadione answered 3/2, 2015 at 17:7 Comment(17)
Handy little tool, and saves having to install anything new when you already have VS installed.Grisaille
Yes, dumpbin.exe is very useful to figure out /dependents and /imports. You can also use it on other machines if you copy link.exe along with it and make sure the corresponding x86 Visual C++ Runtime Redistributable (msvcr120.dll for Visual Studio 2013) is available on the target machine. Some options have additional dependencies. - By the way, they screwed up the option name, it should have been /PREREQUISITES rather than /DEPENDENTS, they should have studied Latin.Barefoot
If you get an error message with mspdb110.dll not found, try launching the 64 version instead VC\bin\amd64\dumpbin.exe before re-installing Visual Studio ;)Cachou
It's so great, we added this into our build system as a verification step when the final executable is generated so we don't depend on something that is not included in the shipping.Outdistance
The only drawback is this handy tool is very hidden: c:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\bin\Hostx64\x64>dumpbinSolidago
dumpbin only lists DLLs but doesn't check for their presence.Covetous
For VS2017 or VS2019 this answer works perfectly well to ensure dumpbin is available on your machine: https://mcmap.net/q/21502/-cannot-find-dumpbin-exeStreptomycin
@Solidago If you open the Visual Studio command line (Tools -> Visual Studio Command Prompt) this is recognized as an external command and you only need to type "dumpbin".Highstepper
@Menadione this didn't work for my DLL. I know the tensorflow.dll I downloaded epends upon a cuda DLL. It displays an error stating such when I run the program. However the dumpbin command does not list any cuda DLLS as a dependency.Shawntashawwal
Well, that's probably because the tensorflow dll loads this cuda dll via LoadLibrary. Such dependencies cannot be detected.Menadione
@Solidago just open start menu, type "dev" and open Developer Command Prompt (which is the same as Tools > Visual Studio Command Prompt in VS), or run vcvarsall.bat manuallyBurny
This is the best answer for me!Siddra
@Menadione ldd (see the answer below this one) detects recursive DLL dependencies just fine.Irregular
"The code execution cannot proceed because mspdb110.dll was not found"... the project builds fine on another machine... just kill me.Aitch
it seems like dumpbin would need to be combined with some other scripting in order to identify missing DLLs ?Opiate
For me it was in C:\Program Files\Microsoft Visual Studio\2022\Community\SDK\ScopeCppSDK\vc15\VC\binComanchean
I will buy you a beer, any time. Thank you amigo!!!!Carinthia
E
94

I can recommend interesting solution for Linux fans. After I explored this solution, I've switched from DependencyWalker to this.

You can use your favorite ldd over Windows-related exe, dll.

To do this you need to install Cygwin (basic installation, without additional packages required) on your Windows and then just start Cygwin Terminal. Now you can run your favorite Linux commands, including:

$ ldd your_dll_file.dll

UPD: You can use ldd also through git bash terminal on Windows. No need to install cygwin in case if you have git already installed.

Erymanthus answered 8/10, 2015 at 14:49 Comment(6)
I just install the cygwin and was happy to find back linux commands, but I could not get out of the Cygwin root to acces other files on my local drive (C:). Is that normal?Cachou
I think this could help you: #1851420Erymanthus
Unfortunately, there are some dependencies that are not found this way: $ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000). The utility dumpbin shows all dependencies correctly.Shaylynn
I use ldd through GIT BASH terminal on windows and works fine. So if you have git it wil be easy, no need to install cygwin. Example: borkox@bobipc MINGW64 ~ $ ldd /c/Users/borkox/.javacpp/cache/openblas-0.3.0-1.4.2-windows-x86_64.jar/org/bytedeco/javacpp/windows-x86_64/jniopenblas_nolapack.dll ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffe46910000) KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffe46610000) KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7ffe42d40000) msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffe44120000)Agnomen
As someone who already had git bash installed, this was a preferable solution. Thank you!Lastminute
you can use "strace yourprogram" to see which dll you needLucianaluciano
V
45
  1. Figure out the full file path to the assembly you're trying to work with

  2. Press the start button, type "dev". Launch the program called "Developer Command Prompt for VS 2017"

  3. In the window that opens, type dumpbin /dependents [path], where [path] is the path you figured out in step 1

  4. press the enter key

Bam, you've got your dependency information. The window should look like this:

enter image description here

Update for VS 2019: you need this package in your VS installation: enter image description here

Vibes answered 10/11, 2018 at 8:53 Comment(1)
"Bam" all you want, but I don't find dumpbin all that useful, because it isn't recursive. If any DLL dependency in turn depends on a DLL not already among the list of direct dependencies, you're still screwed. Better to use a tool that isn't half-assed, such as ldd.Irregular
G
24

Try Dependencies it is described as "An open-source modern Dependency Walker".

It has a GUI but it also works from the command line with optional JSON output!

To display recursively the dependencies of mydll.dll up to a depth of 1:

Dependencies.exe -chain mydll.dll -depth 1

Example of output:

  □ mydll.dll (ROOT) : C:/.../mydll.dll
|  □ USER32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\user32.dll
|  □ ADVAPI32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\advapi32.dll
|  □ ole32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\ole32.dll
|  □ GDI32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\gdi32.dll
|  □ CRYPT32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\CRYPT32.dll
|  □ Secur32.dll (WindowsFolder) : C:\WINDOWS\SysWOW64\Secur32.dll
|  □ MSVCP140D.dll (WindowsFolder) : C:\WINDOWS\SysWOW64\MSVCP140D.dll
|  □ USP10.dll (WindowsFolder) : C:\WINDOWS\SysWOW64\USP10.dll
|  □ KERNEL32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\kernel32.dll
|  □ VCRUNTIME140D.dll (WindowsFolder) : C:\WINDOWS\SysWOW64\VCRUNTIME140D.dll
|  □ ucrtbased.dll (WindowsFolder) : C:\WINDOWS\SysWOW64\ucrtbased.dll

If a DLL is missing (at any depth) the output is similar to:

├ mydll.dll (ROOT) : other.dll
|  ├ other.dll (NOT_FOUND) :

Note that it may take a long time to produce a result if the maximum dependency depth is deep.

Galloway answered 10/5, 2022 at 16:14 Comment(3)
Nice tool, without having Cygwin or Visual Studio Runtime installed. Thank you for sharing!Alright
will the tool also indicate on output what DLL is missing ? how is this indicated on the output (of this great tool) the DLL being missing on the system it runs on ? I'm trying to debug docker container with this tool...Expense
@Expense I have just tested and yes the output is clear on a missing DLL, see my edited answer. Good luck with your debugging.Galloway
J
10
  1. There is a program called "Depends"
  2. If you have cygwin installed, nothing simpler then ldd file.exe
Judiciary answered 11/9, 2011 at 14:47 Comment(4)
The tool is called Dependency Walker; it's executable image is named depends.exe.Carrissa
Dependency Walker is dated. Its last built is in 2008!Joon
depends doesn't support API sets so it's useless for Win7+.Covetous
For a modern alternative to "Depends" see my answerGalloway
B
10

The safest thing is have some clean virtual machine, on which you can test your program. On every version you'd like to test, restore the VM to its initial clean value. Then install your program using its setup, and see if it works.

Dll problems have different faces. If you use Visual Studio and dynamically link to the CRT, you have to distribute the CRT DLLs. Update your VS, and you have to distribute another version of the CRT. Just checking dependencies is not enough, as you might miss those. Doing a full install on a clean machine is the only safe solution, IMO.

If you don't want to setup a full-blown test environment and have Windows 7, you can use XP-Mode as the initial clean machine, and XP-More to duplicate the VM.

Belden answered 11/9, 2011 at 14:48 Comment(0)
X
7

On your development machine, you can execute the program and run Sysinternals Process Explorer. In the lower pane, it will show you the loaded DLLs and the current paths to them which is handy for a number of reasons. If you are executing off your deployment package, it would reveal which DLLs are referenced in the wrong path (i.e. weren't packaged correctly).

Currently, our company uses Visual Studio Installer projects to walk the dependency tree and output as loose files the program. In VS2013, this is now an extension: https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d. We then package these loose files in a more comprehensive installer but at least that setup project all the dot net dependencies and drops them into the one spot and warns you when things are missing.

Xylograph answered 9/7, 2015 at 0:59 Comment(0)
A
5

NDepend was already mentioned by Jesse (if you analyze .NET code) but let's explain exactly how it can help.

Is there a program/script that can scan an executable for DLL dependencies or execute the program in a "clean" DLL-free environment for testing to prevent these oops situations?

In the NDepend Project Properties panel, you can define what application assemblies to analyze (in green) and NDepend will infer Third-Party assemblies used by application ones (in blue). A list of directories where to search application and third-party assemblies is provided.

NDepend Project Properties Application and Third-Party assemblies

If a third-party assembly is not found in these directories, it will be in error mode. For example, if I remove the .NET Fx directory C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319, I can see that .NET Fx third-party assemblies are not resolved:

NDepend Project Properties Application and Third-Party assemblies not resolved

Disclaimer: I work for NDepend

Abbieabbot answered 12/6, 2017 at 13:49 Comment(0)
S
3

In the past (i.e. WinXP days), I used to depend/rely on DLL Dependency Walker (depends.exe) but there are times when I am still not able to determine the DLL issue(s). Ideally, we'd like to find out before runtime by inspections but if that does not resolve it (or taking too much time), you can try enabling the "loader snap" as described on http://blogs.msdn.com/b/junfeng/archive/2006/11/20/debugging-loadlibrary-failures.aspx and https://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspx and briefly mentioned LoadLibrary fails; GetLastError no help

WARNING: I've messed up my Windows in the past fooling around with gflag making it crawl to its knees, you have been forewarned.

enter image description here

Note: "Loader snap" is per-process so the UI enable won't stay checked (use cdb or glfags -i)

Sheave answered 8/7, 2015 at 16:32 Comment(0)
P
2

Please refer SysInternal toolkit from Microsoft from below link, https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer

Goto the download folder, Open "Procexp64.exe" as admin privilege. Open Find Menu-> "Find Handle or DLL" option or Ctrl+F shortcut way.

enter image description here

Pastorship answered 8/7, 2019 at 12:15 Comment(0)
Z
1

Was the DLL compiled in "Debug Mode" and then deployed?

If so, it may depend on "D" versions of DLLs. For example:

  MSVCP140D.dll
  VCRUNTIME140D.dll

These would not be dependents if the DLL is built in "Release Mode." The D versions do not come with the Microsoft Visual C++ Redistributables.

To see if that is the case, as others have pointed out:

From Visual Studio: Tools -> Visual Studio Command Prompt.

In the command prompt run dumpbin /dependents against the DLL.

Zomba answered 15/2, 2022 at 19:26 Comment(0)
T
0

To view ".dll" dependencies and other useful information in Windows - i can highly recommend the CFF Explorer (https://ntcore.com/?page_id=388) its free and very useful. You can view "import" and "export" dependencies of the ".dll" file and many other functions. And it comes with a GUI - so you dont have to use the cli ...

Tertiary answered 8/2, 2023 at 20:33 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.