C++ 如何自动获取静态链接的dll依赖项
在创建新项目时,我总是偶然发现我的最终可执行文件或dll无法正常运行,因为它缺少我使用的依赖项 在我作为一名开发人员的生活中,我见过几种处理这种问题的方法(我不喜欢任何一种)C++ 如何自动获取静态链接的dll依赖项,c++,windows,visual-studio,dependency-management,C++,Windows,Visual Studio,Dependency Management,在创建新项目时,我总是偶然发现我的最终可执行文件或dll无法正常运行,因为它缺少我使用的依赖项 在我作为一名开发人员的生活中,我见过几种处理这种问题的方法(我不喜欢任何一种) 将环境路径设置为所有这些依赖项,以便操作系统能够找到它们(不好,因为非常不可移植,需要环境,无法开箱即用) 将潜在大型软件包的每个依赖项复制到二进制输出目录中(例如,不管需要多少DLL)。对于OSG、Qt等依赖项,这是非常奇怪的,因为您通常不会链接大型软件包提供的所有DLL,并且您可能会复制比需要多得多的数据 使用细粒度
- 将环境路径设置为所有这些依赖项,以便操作系统能够找到它们(不好,因为非常不可移植,需要环境,无法开箱即用)
- 将潜在大型软件包的每个依赖项复制到二进制输出目录中(例如,不管需要多少DLL)。对于OSG、Qt等依赖项,这是非常奇怪的,因为您通常不会链接大型软件包提供的所有DLL,并且您可能会复制比需要多得多的数据
- 使用细粒度xcopy/robocopy或任何任务手动选择单个依赖项(以及可选的PDB)。(我不喜欢这样,因为它需要注意,我在VisualStudio中添加了一个依赖项,然后我需要调整一些脚本)。有像dependency walker这样的工具可以帮助实现这一点,但是,这可能仍然是不可移植的,因为VS中的include path可能有一个版本,如果您更改它,您还需要在脚本中更改它,这太多了
冗余部门
我正在考虑用一种更通用的方法来解决更多项目的这个问题,但我真的想知道我是否遗漏了什么。请参阅:在家里和工作中,我使用
CMake
生成Visual Studio项目文件,并让它收集所有依赖项,然后将它们添加到为我的应用程序生成的安装程序中。尽管如此,学习CMake需要大量的时间/工作。无论如何,我不确定我会推荐它仅用于此功能。根据我上面的评论,我使用CMake
的方法介于你的第二个和第三个项目之间,例如在Qt的情况下。我的CMake
脚本知道(通过我告诉它/设置CMake
变量)我正在使用QtCore、QtSql。。。因此,在生成包时,我的CMake宏知道Qt要添加到依赖项列表中的DLL。尽管如此,CMake确实有一种自动确定依赖DLL的方法。然而,我通常不使用它。@RichardCritten我的第三个子弹字面上使用了dependency walker这个词。@drescherjm有趣的是:我在重构一个远离CMake的项目时提出了这个问题,因为我发现它非常糟糕(使用它超过7年),而且它并没有真正将内容复制到output dir。