【发布时间】:2022-01-11 03:42:47
【问题描述】:
在我当前的一个项目中,我需要构建一个 Windows 可执行文件。我们使用外部库(libpq)。 CMake 找到 .lib 文件并能够针对库进行构建。但是,我们需要捆绑 libpq 的依赖项。我们不知道它们,因为它们可能与使用的 libpq 版本不同。
有什么方法可以扫描这些依赖项(及其依赖项),以便我们可以在 CPack 的帮助下捆绑它们?
【问题讨论】:
在我当前的一个项目中,我需要构建一个 Windows 可执行文件。我们使用外部库(libpq)。 CMake 找到 .lib 文件并能够针对库进行构建。但是,我们需要捆绑 libpq 的依赖项。我们不知道它们,因为它们可能与使用的 libpq 版本不同。
有什么方法可以扫描这些依赖项(及其依赖项),以便我们可以在 CPack 的帮助下捆绑它们?
【问题讨论】:
您可以将dumpbin.exe 与/imports 命令行一起使用,这是一个与Visual Studio 或Windows SDK 捆绑在一起的命令行工具。您可以在两个主 EXE 上运行它以发现它依赖于哪些 DLL,也可以在单个 DLL 上运行它以查看它们所依赖的内容。
通常,我只需运行dumpbin /imports foo.exe | findstr /i dll 即可快速找出它所依赖的 DLL。
另一个有用的工具是depends (Dependency Walker)。它有点过时了,但它是一个 GUI 版本的 dumpbin,可以显示系统在哪里找到相关的 DLL。
还有来自 MS Sysinternals 小组的 listdll。
我们不知道它们,因为它们可能与使用的 libpq 版本不同。
是的,你知道。无论您使用什么版本的 libpq 构建,您都应该从同一版本发布相应的 DLL(如果有)。
您通常对二进制文件依赖项进行硬编码,而不是尝试做一些构建环境的诡计。也就是说,您知道您正在链接一个 DLL 导入库,您应该知道需要与您的 EXE 一起提供哪些 DLL。
如果 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
【讨论】:
dumpbin。也许我可以为这种情况创建一个独立的 CMake 模块。谢谢