Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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/9/opencv/3.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';什么是exe?_C++_Opencv_Visual Studio 2012_Dll_Exe - Fatal编程技术网

C++ 如何包含所有dll';什么是exe?

C++ 如何包含所有dll';什么是exe?,c++,opencv,visual-studio-2012,dll,exe,C++,Opencv,Visual Studio 2012,Dll,Exe,我有一个VisualStudio12项目;用C++编写的源代码;这是一个OpenCV项目。我想把我编译的程序交给其他人,但在另一台电脑上,我收到一条关于丢失一些DLL的错误消息。我的程序使用了许多OpenCV(也许,不仅仅是)dll如何解决该问题?在VS 12中,可以选择在.exe中包含所有dll? 这是一个非常相似的问题,没有正确的答案: DLL本身不能“静态链接”到可执行文件中;这完全违背了他们的目的(好吧,实际上你可以使用一些非常奇怪的巫毒技巧来真正做到这一点,但这既不可取,如果你不得不问

我有一个VisualStudio12项目;用C++编写的源代码;这是一个OpenCV项目。我想把我编译的程序交给其他人,但在另一台电脑上,我收到一条关于丢失一些DLL的错误消息。我的程序使用了许多OpenCV(也许,不仅仅是)dll如何解决该问题?在VS 12中,可以选择在.exe中包含所有dll? 这是一个非常相似的问题,没有正确的答案: DLL本身不能“静态链接”到可执行文件中;这完全违背了他们的目的(好吧,实际上你可以使用一些非常奇怪的巫毒技巧来真正做到这一点,但这既不可取,如果你不得不问这个问题,你也不应该尝试)


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

更复杂的解决方案是,从src构建静态opencv库,然后将您的程序与这些库相链接,生成一个大的二进制exe块,它不使用任何DLL(除了ffmpeg,不确定该块)

要构建静态libs,您需要使用:build\u SHARED\u libs=OFF运行cmake

但是在做那件事之前,深呼吸一下。链接您的程序将非常困难,因为现在您必须手动链接所有的zlib、libpng和任何依赖项(之前可以方便地链接到DLL中)

同样,最简单的解决方案是在程序中部署所有opencv DLL。

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


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

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


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

可能与@LuchianGrigore重复:您无法静态链接DLL。DLL是围绕动态链接构建的。是的,静态链接是最好的选择,但你需要一个静态库。@datenwolf是的,我的意思是静态链接:)@Joe answer(在那页上)提供的答案对我没有帮助。我已经做了这些步骤(由Zaw Lin提供)。我知道这是一篇非常古老的帖子,但我对“奇怪的巫毒把戏”非常感兴趣。你能详细解释一下吗?@MooseBoys:给一个粗略的总结。所涉及的步骤是使用类似于objcopy(也许您甚至可以使用objcopy)或objdump的工具将DLL/共享对象“断开”到普通对象文件中。但是,DLL/共享对象具有入口点
DllMain
/
\u init/\u fini
,这些入口点在特殊时间被调用。还有两个特殊部分用于符号位置转换。Windows DLL允许进程间共享内存节。等等。等等。最终你会把所有的东西都分割成对象,并作为一个静态库重新链接。@MooseBoys:另一种方法是简单地将整个DLL/共享对象作为二进制blob嵌入到可执行文件中。程序启动时,可执行文件的一部分可以重新映射为虚拟文件/文件视图,并传递给动态链接器。@MooseBoys:还有一种方法是在可执行文件中实现自定义动态链接器,并让它直接与嵌入DLL/共享对象的二进制blob一起工作。–除了解除链接/重新链接的方式外,其他两种方法都非常可怕(主要是出于安全原因)。@schlebe:最初的问题是,如果一开始没有运行时环境解释器,如何“嵌入”DLL(或静态链接它)。这是一个完全不同的问题范围。与其他操作系统相比,操作系统的目标是移动的,因为操作系统询问特定的操作系统,而其他系统的“营销”在这方面没有帮助。