链接到外部 .lib 文件后查找所需的 dll

Find required dll's after linking to an external .lib file

在我当前的一个项目中,我需要构建一个 windows 可执行文件。我们使用外部库 (libpq)。 CMake 找到 .lib 文件并能够针对该库进行构建。但是,我们需要捆绑 libpq 的依赖项。我们不知道它们,因为它们可能与使用的 libpq 版本不同。

是否有任何方法可以扫描这些依赖项(及其依赖项),以便我们可以在 CPack 的帮助下将它们捆绑在一起?

您可以使用 dumpbin.exe,一个与 Visual Studio 或 Windows SDK 捆绑在一起的命令行工具,以及 /imports 命令行。您可以 运行 在您的主 EXE 上使用它来发现它依赖于哪些 DLL,也可以在各个 DLL 上查看它们所依赖的内容。

很多时候,我只是 运行 dumpbin /imports foo.exe | findstr /i dll 来快速找出它所依赖的 DLL。

另一个有用的工具是 depends (Dependency Walker)。它有点过时,但它是 dumpbin 的 GUI 版本,可以向您显示系统在哪里找到相关的 DLL。

还有 listdll 来自 MS 的 Sysinternals 小组。

We don't know them, as they can differ from the used libpq version.

是的,你知道。无论您使用何种版本的 libpq 构建,您都应该从同一版本发布相应的 DLL(如果有的话)。

您通常对二进制文件依赖项进行硬编码,而不是尝试对构建环境进行一些欺骗。也就是说,您知道您正在链接一个 DLL 导入库,您应该知道您需要将哪些 DLL 与您的 EXE 一起发送。

如果 libpq 是一个完全独立的 LIB,只是静态链接到您的 EXE,那么您可能已经完成了。无需考虑进一步的工作。

如果 libpq 是具有相应 DLL 的存根库,则您将 DLL(例如“libpq.dll”)及其依赖项与 EXE 放在同一文件夹中。

同样,dumpbin.exe 将帮助您找到依赖项。另外,请阅读:https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order