Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何自动获取静态链接的dll依赖项_C++_Windows_Visual Studio_Dependency Management - Fatal编程技术网

C++ 如何自动获取静态链接的dll依赖项

C++ 如何自动获取静态链接的dll依赖项,c++,windows,visual-studio,dependency-management,C++,Windows,Visual Studio,Dependency Management,在创建新项目时,我总是偶然发现我的最终可执行文件或dll无法正常运行,因为它缺少我使用的依赖项 在我作为一名开发人员的生活中,我见过几种处理这种问题的方法(我不喜欢任何一种) 将环境路径设置为所有这些依赖项,以便操作系统能够找到它们(不好,因为非常不可移植,需要环境,无法开箱即用) 将潜在大型软件包的每个依赖项复制到二进制输出目录中(例如,不管需要多少DLL)。对于OSG、Qt等依赖项,这是非常奇怪的,因为您通常不会链接大型软件包提供的所有DLL,并且您可能会复制比需要多得多的数据 使用细粒度

在创建新项目时,我总是偶然发现我的最终可执行文件或dll无法正常运行,因为它缺少我使用的依赖项

在我作为一名开发人员的生活中,我见过几种处理这种问题的方法(我不喜欢任何一种)

  • 将环境路径设置为所有这些依赖项,以便操作系统能够找到它们(不好,因为非常不可移植,需要环境,无法开箱即用)
  • 将潜在大型软件包的每个依赖项复制到二进制输出目录中(例如,不管需要多少DLL)。对于OSG、Qt等依赖项,这是非常奇怪的,因为您通常不会链接大型软件包提供的所有DLL,并且您可能会复制比需要多得多的数据
  • 使用细粒度xcopy/robocopy或任何任务手动选择单个依赖项(以及可选的PDB)。(我不喜欢这样,因为它需要注意,我在VisualStudio中添加了一个依赖项,然后我需要调整一些脚本)。有像dependency walker这样的工具可以帮助实现这一点,但是,这可能仍然是不可移植的,因为VS中的include path可能有一个版本,如果您更改它,您还需要在脚本中更改它,这太多了
    冗余部门
在较大的项目或公司中,我希望这个问题相当普遍。他们在VisualStudio或Windows中没有任何东西可以帮助实现这一点吗?为了编译二进制文件,我需要正确地选择include路径和import lib路径,但接下来我需要一些其他机制来实际工作


我正在考虑用一种更通用的方法来解决更多项目的这个问题,但我真的想知道我是否遗漏了什么。

请参阅:在家里和工作中,我使用
CMake
生成Visual Studio项目文件,并让它收集所有依赖项,然后将它们添加到为我的应用程序生成的安装程序中。尽管如此,学习CMake需要大量的时间/工作。无论如何,我不确定我会推荐它仅用于此功能。根据我上面的评论,我使用
CMake
的方法介于你的第二个和第三个项目之间,例如在Qt的情况下。我的
CMake
脚本知道(通过我告诉它/设置
CMake
变量)我正在使用QtCore、QtSql。。。因此,在生成包时,我的CMake宏知道Qt要添加到依赖项列表中的DLL。尽管如此,CMake确实有一种自动确定依赖DLL的方法。然而,我通常不使用它。@RichardCritten我的第三个子弹字面上使用了dependency walker这个词。@drescherjm有趣的是:我在重构一个远离CMake的项目时提出了这个问题,因为我发现它非常糟糕(使用它超过7年),而且它并没有真正将内容复制到output dir。