如何在exe中包含所有dll?
How to include all dll's in exe?
我有一个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位)使用x64
或x86
。vc
的版本可以在您的系统上不同(vc9
, vc10
等…)
- 如何告诉本机节点模块所需的dll存储在哪里?
- 我应该如何为包含动态数组的类编写所需的构造函数
- 是否可以将要"ShellExecute"的文件包含在 dll 中?如果是这样,"ShellExecute"中的文件位置应该是什么?
- C++将包含的库 (ref DLL) 从根目录更改为另一个位置
- 如何在 windowsservercore Docker 映像上安装执行本机C++ DLL/EXE 所需的所有依赖二进制
- 标头包含不是 .c 程序所必需的,而是.cpp程序需要的
- 在 MFC dll 中包含助推互斥头文件时断言
- 有关 DLL 中包含的说明
- 如何在cython中包含C++所需的路径
- 当我无法包含代码所需的头文件时,如何链接 shrared 库?
- vcruntime140_app.dll未包含在Microsoft Visual C 2017重新分布(X64)中
- C++ ATIOGLXX.pdb 包含查找模块 ATIOGLXX.dll 源代码所需的调试信息
- 如何将我的C++DLL包含在一个单独的项目中
- 调用包含所有所需代码的函数或内部包含所需代码的其他函数的函数更好?
- 将库和DLL包含在C ++项目中
- 使一个标头成为多个类包含所必需的
- 如何将dll包含为相对路径
- 创建一个类,其静态成员容器包含所述类的所有实例
- 使用/CLR标志构建的本机dll包含托管类
- DLL包含unordered_map不能用visual studio编译器编译