C++ 可执行文件是不是包括 .obj、.lib 和 .dll?
Posted
技术标签:
【中文标题】C++ 可执行文件是不是包括 .obj、.lib 和 .dll?【英文标题】:Do C++ executable includes .obj, .lib and .dll?C++ 可执行文件是否包括 .obj、.lib 和 .dll? 【发布时间】:2018-09-26 00:50:12 【问题描述】:我有一个输出 C++ .exe 的 C++ 项目。该项目依赖于一些.lib 和.dll。如果我想在另一台服务器上使用 .exe,我可以只传输 .exe 而没有 .lib、.dll 和 .obj 吗? .exe 是否已构建,因此它“包含”这些文件?
谢谢!
【问题讨论】:
没有它们你不能复制可执行文件,看看它是否能解决这个问题? 如果我们谈论的是 Visual Studio,那么您的程序将具有与您用作依赖项的 Visual Studio 版本等效的 Visual C++ Redistributable。您不应该复制 .DLL,而是在目标机器上安装 Visual C++ Redist。 Ken White:是的,但我想了解它是如何工作的。 【参考方案1】:C++中的编译/链接过程比较复杂,但一般都遵循这个路径。
cpp/hpp-> 对象
obj -> lib (.a) 用于静态库 或者 obj -> dll (.so) 用于动态库
obj、lib、dll -> exe
链接过程将获取 obj 和静态库并形成一个自包含的 exe。链接器使exe依赖于dll,但exe不会包含动态库。
回答您的问题,运行时将需要 exe 和 dll。运行时肯定不需要 obj 和 static lib 文件。
【讨论】:
但是......不要不要简单地确定您的程序所依赖的DLL,然后盲目地将它们复制到另一台机器上。它可能有效,但很可能不会,因为可能缺少其他依赖项或配置。 除非您自己创建了这些 DLL,或者知道它们很容易以这种方式移植。 请在继续之前考虑@Steve 的重要评论。例如,不建议复制系统 dll以上是关于C++ 可执行文件是不是包括 .obj、.lib 和 .dll?的主要内容,如果未能解决你的问题,请参考以下文章
.LIB 和 .OBJ 文件有啥区别? (Visual Studio C++)
C++ 可执行文件在运行时找不到库,即使它位于 /usr/lib 中(在 Linux 上)
如何从 Visual C++ 的 .obj 文件构建静态和动态库?