gpt4 book ai didi

c++ - 哪些 dll 包含在我编译的可执行文件中 - 区分系统和其他 dll

转载 作者:行者123 更新时间:2023-12-04 13:26:22 27 4
gpt4 key购买 nike

我有一个使用 CMake 生成构建文件的 C++ 项目。这个项目依赖于外部库,我从互联网上下载了必要的文件(头文件、.lib 和 .dll)。我的项目可以编译,如果库的 DLL 包含在 PATH 中,或者将 DLL 复制到与我的项目的 .exe 相同的位置,它运行没有问题。现在我希望能够在另一台计算机上运行这个程序。为此,我需要知道我必须在我的 .exe 文件旁边包含哪些 DLL。
我已经看到可以使用 MVSC dumpbin 找到任何给定 dll 或 exe 的 DLL 依赖项。 .例如对于这个主要:

#include <QApplication>
#include <QStyleFactory>
#include <QFileDialog>
#include <QStandardPaths>
#include <opencv2/highgui/highgui.hpp>

int main(int argc, char** argv)
{
// Create application
QApplication app(argc, argv);
app.setStyle(QStyleFactory::create(QStringLiteral("Fusion")));

// Get file name
QString file_name = QFileDialog::getOpenFileName(nullptr, QObject::tr("Open File"),
QStandardPaths::displayName(QStandardPaths::HomeLocation),
QObject::tr("Images (*.png *.xpm *.jpg)"));

// Read image
cv::Mat mat = cv::imread(file_name.toStdString());

// Show image in opencv
cv::namedWindow("display",cv::WINDOW_KEEPRATIO |cv::WINDOW_GUI_NORMAL );
cv::imshow("display",mat);
cv::waitKey(0);

// Run application
return app.exec();
}
命令的输出 dumpbin /dependents main.exe是:
Microsoft (R) COFF/PE Dumper Version 14.28.29912.0
Copyright (C) Microsoft Corporation. All rights reserved.


Dump of file .\src\RelWithDebInfo\main.exe

File Type: EXECUTABLE IMAGE

Image has the following dependencies:

Qt5Widgets.dll
opencv_world347.dll
Qt5Core.dll
VCRUNTIME140.dll
VCRUNTIME140_1.dll
api-ms-win-crt-runtime-l1-1-0.dll
api-ms-win-crt-math-l1-1-0.dll
api-ms-win-crt-stdio-l1-1-0.dll
api-ms-win-crt-locale-l1-1-0.dll
api-ms-win-crt-heap-l1-1-0.dll
KERNEL32.dll
SHELL32.dll

Summary

1000 .00cfg
1000 .data
2000 .idata
1000 .pdata
3000 .rdata
1000 .reloc
1000 .rsrc
6000 .text
在这种情况下,我需要这个 DLL 列表来运行我的程序。但是,有些是系统 DLL(KERNEL32.dll、SHELL32.dll...),有些是不是系统 DLL(Qt5Widgets.dll、opencv_world347.dll...)的库。
我应该在哪里决定停止复制 DLL 来发布我的程序?我应该用 KERNEL32.dll 发货吗?和 SHELL32.dll , 我应该包括 api-ms-win*.dll或者我应该只包括 Qt5Widgets.dll , Qt5Core.dll , 和 opencv_world347.dll ? 我如何从列表中知道哪些是系统 DLL,哪些不是?
PS2 :我知道专门针对 Qt 有 windeployqt这将自动处理 Qt DLL 部分和 VCRUNTIME140*.dll部分也通过安装 vc_redist 处理
备注 : 这个问题的范围只是知道在哪里停止。我对如何构建安装程序或如何自动化文件拷贝或在哪里查找依赖 DLL 不感兴趣。
注2 : 问题 Find dependent modules of dllhow do I include dll's such as kernel32.dll which my unmanaged dll needs没有回答我的问题。

最佳答案

一般情况:
根据我的经验,这个问题经常出现在开发过程的早期。
在我看来:当一个人开始一个空项目时,没有必要用 i 嵌入任何 dll。正如您所说:不提供系统 dll。
在某些时候,人们决定在项目中使用 opencv、QT 或任何外部依赖项。此时可以在制作文件(或项目/解决方案文件)中添加所需的头文件,并在构建脚本中添加 dll。
事实上,将 dll 添加到发货是决定使用依赖项的一部分。
因此,对您的问题的简短回答是:您知道要嵌入哪个 dll,因为它已在您尝试添加到项目中的依赖项的文档中指定。 ( doc sample for opencv )
具体案例:
我们可以想象,有人在某个不起眼的存储库中找到了一段代码,没有任何文档、历史信息,也没有“构建”脚本或等价物。这个人想要构建和发布它,所以他必须决定要嵌入哪个 dll。
这个人会做你所做的事情:使用依赖遍历器获取所有依赖列表,然后根据自己的判断决定他想要提供哪个。
我假设,如果应用程序在 Windows 上运行,这家伙会嵌入除 Windows 特定 dll 之外的所有内容,或者执行安装程序。

关于c++ - 哪些 dll 包含在我编译的可执行文件中 - 区分系统和其他 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68345233/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com