如何在exe中包含所有dll?

How to include all dll's in exe?

本文关键字:dll 包含所 exe      更新时间:2023-10-16

我有一个Visual Studio 12项目;源代码用c++编写;它是一个OpenCV项目。我想给我的编译程序给别人,但是,在其他PC上,我得到一个关于缺少一些dll的错误消息。我的程序使用了许多OpenCV(也许,不只是)dll。我该如何解决这个问题?也许在VS 12可用的选项,包括所有的dll的。exe?这是一个非常相似的问题,没有正确的答案:在visual studio c++ 2008中包含dll

dll本身不能被"静态链接";转换成可执行文件;这完全违背了他们的目的(好吧,实际上你可以使用一些非常奇怪的巫术技巧来真正做到这一点,但如果你必须问这个问题,这既不推荐也不应该尝试)。

简单的解决方案是识别程序所需的所有dll(在调试器中启动程序将生成一个列出所有dll的日志文件),并将这些dll复制到EXE所在的同一目录中;碰巧的是,EXE文件所在的目录也是系统在进入默认配置中的标准系统目录之前查找dll的第一个目录。

更复杂的解决方案是,从src构建静态opencv库,然后将您的程序链接到这些库,从而产生一个大的二进制前块,不使用任何dll(除了ffmpeg,不确定那个)。

构建静态库,你需要运行cmake命令:BUILD_SHARED_LIBS=OFF

但在那之前请深呼吸。链接您的程序将会非常困难,因为现在您必须手动链接所有的zlib,libpng等依赖项(以前可以方便地链接到您的dll中)

同样,最简单的解决方案是将所有opencv dll与程序一起部署。

您可以使用Windows Dependency Walker来确定您的程序需要运行哪些dll。

实际上,这只是告诉您程序需要哪些dll才能成功启动。如果你动态加载dll(通过LoadLibrary),那么你就得靠自己了。

如果您选择接受的解决方案(将dll与EXE文件打包),并且您不想陷入查找要使用哪些dll的麻烦,那么您可以复制所有OpenCV dll。它们不是那么大(在OpenCV 2.43上为65 MB)。它们位于...opencvXXXbuildx64vc10bin

,其中XXX是OpenCV版本。您可以根据您的平台(32位或64位)使用x64x86vc的版本可以在您的系统上不同(vc9, vc10等…)