如何在exe中包含所有dll?

时间:2014-05-24 12:12:51

标签: c++ opencv visual-studio-2012 dll exe

我有一个Visual Studio 12项目;用C ++编写的源代码;它是一个OpenCV项目。我想将我编译的程序提供给其他人,但是,在其他PC上,我收到有关丢失一些dll的错误消息。我的程序使用了许多OpenCV(也许,不仅仅是)dll' s。 如何解决该问题? 也许在VS 12中可以选择在.exe中包含所有dll? 没有正确答案,这是一个非常相似的问题: include dlls in visual studio c++ 2008

4 个答案:

答案 0 :(得分:11)

DLL本身不能“静态链接”到可执行文件中;这完全违背了他们的目的(嗯,实际上你可以使用一些非常奇怪的伏都教技巧来实际做到这一点,但这既不推荐也不应该尝试,如果你不得不提出这个问题)。

简单的解决方案是识别程序所需的所有DLL(只需启动调试器中的程序将生成列出所有这些的日志文件)并将这些DLL复制到EXE所在的同一目录中;当发生这种情况时,带有EXE文件的目录也是系统在默认配置中前进到standad系统directoris之前查找DLL的第一个目录。打包并以这种方式分发。

答案 1 :(得分:4)

更复杂的解决方案是,从src构建静态opencv库,然后将程序链接到那些,导致1个大型二进制exe-chunk,不使用任何dll(除了ffmpeg,不确定那个)。

要构建静态库,您需要运行cmake:BUILD_SHARED_LIBS = OFF

在这样做之前,请深吸一口气。链接你的程序将会非常困难,因为现在你必须手动链接所有zlib,libpng和任何dependecies(之前已经方便地链接到你的dll)

再次,最简单的解决方案是使用您的程序部署所有opencv dll。

答案 2 :(得分:3)

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

实际上,这只会告诉您程序需要成功启动哪些DLL。如果您动态加载DLL(通过LoadLibrary),那么您就是自己的。

答案 3 :(得分:1)

如果您选择接受的解决方案(使用EXE文件打包DLL),并且您不想找到要使用的DLL的麻烦,那么您可以复制所有OpenCV DLL。它们不是那么大(在OpenCV 2.43上为65 MB)。它们位于...\opencvXXX\build\x64\vc10\bin\

其中XXX是OpenCV版本。您可以使用x64x86,具体取决于您的平台(32或64位)。 vc的版本在您的系统上可能会有所不同(vc9vc10等等。)