【问题标题】:Find required dll's after linking to an external .lib file链接到外部 .lib 文件后查找所需的 dll
【发布时间】:2022-01-11 03:42:47
【问题描述】:

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

有什么方法可以扫描这些依赖项(及其依赖项),以便我们可以在 CPack 的帮助下捆绑它们?

【问题讨论】:

    标签: windows cmake cpack


    【解决方案1】:

    您可以将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

    【讨论】:

    • 我们知道我们需要 libpq.dll,但 libpq.dll 依赖于其他一些库,例如 openssl,可以是 libssl-1.0.1.dll 或 libssl-1.1.0.dll 或...你懂了。我可以肯定地对这些进行硬编码,但如果上游改变了任何东西,构建就会中断。而且我们无法针对不同的 libpq 版本进行测试
    • @ThomasBerger - 我不确定我是否完全理解。为什么不发布与日常构建链接相同的 libpq DLL(和依赖 DLL)?我不确定你的上游分支是如何工作的,但是如果它会破坏构建,你不会阻止合并或拉取请求吗?与尝试自动推断 DLL 依赖关系的复杂脚本的成本相比,考虑一下修复损坏的构建的成本。如果我缺少某些东西,我很高兴能接受有关此主题的教育。
    • 因为这个库是作为开源项目交付的。提供构建是一回事。让每个人都弄清楚特定安装版本需要哪些库是另一回事。大多数 libpq 附带的库都不是必需的,因为它们是用于其他工具或 PostgreSQL 服务器本身的
    • 哦,我明白了,您正在交付一个开源项目,该项目依赖于构建您的 EXE 的个人或团队提供的 libpq.lib。对吗?
    • libpq.lib 是 Windows 版 PostgreSQL 的一部分,由 EDB 提供。 libpq 是 PostgreSQL 的官方客户端库。但是我(一个 linux 开发者,而不是一个 windows 人)认为这对于 windows 软件来说是一个常见的问题。我们目前正在摆弄dumpbin。也许我可以为这种情况创建一个独立的 CMake 模块。谢谢
    猜你喜欢
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多