Microsoft Visual C++ - 编译一个没有依赖关系的单个 DLL

Posted

技术标签:

【中文标题】Microsoft Visual C++ - 编译一个没有依赖关系的单个 DLL【英文标题】:Microsoft Visual C++ - Compile one single DLL without dependencies 【发布时间】:2014-03-01 15:38:13 【问题描述】:

我得到了一个巨大的 Microsoft Visual C++ 2003 项目,该项目生成一个可执行文件 (.exe),该项目本身依赖于几个 DLL。我注意到,即使代码设法编译,当它运行时,它也会查找它所依赖的 DLL(比如我的程序称为 abc,它所依赖的 DLL 称为 def.dll),即使我添加了要包含在项目设置中的路径,它会抱怨说找不到 DLL,除非我将包含 def.dll 的文件夹添加到 %PATH% 变量中。

因此,最终产品不是一个 exe,而是一个带有大量 DLL 的 exe。

是否可以将所有内容编译成一个 .exe 文件,这样我就可以随身携带这个可执行文件,它可以在我拥有的每一台 PC 上运行?该项目本身非常庞大,因此我不打算更改每个 .h 和 .cpp 文件,但如果在可视化 C++ 中有快速设置更改,我认为会很好。我知道 .exe 可能会大 10 倍,编译它可能需要几个小时,但我认为可移植性在这里相当重要。

谢谢!

PS:不知道为什么人们对这篇文章投了反对票……我可以不再在 *** 上提出合理的问题吗?我知道这个问题对你们中的一些人来说可能听起来微不足道,但我真的只是为了说明而简化了这个问题。

【问题讨论】:

把所有的 DLL 和可执行文件放在同一个目录下,作业就完成了。 @DavidHeffernan 除了 DLL 位于属于不同依赖程序的不同文件夹中之外,我为了说明而简化了这个问题 不过,将副本放在可执行目录中是公认的解决方案 【参考方案1】:

您需要将 DLL 重新构建为独立的(静态库)并将静态库添加到链接器设置中。但是,如果您不知道预处理器设置和可能的代码更改来创建这样的静态库,我不建议您这样做。

除非作者为您提供执行此任务所需的步骤(通常您需要使用 -D 选项定义预处理器常量),否则您不能只获取 DLL 源代码并将其重新编译为静态库。这些常量是什么以及需要采取哪些额外步骤——DLL 的作者必须告诉您这一点。

如果 DLL 的原作者从未构建过静态库,那么我不建议您尝试,除非您是熟悉必须更改的内容的专家级程序员。在这种情况下,作者从未打算将代码用作静态库,因此要进行的更改可能非常广泛。

【讨论】:

以上是关于Microsoft Visual C++ - 编译一个没有依赖关系的单个 DLL的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Visual C++ - 编译一个没有依赖关系的单个 DLL

Microsoft Visual Studio C++ 2019 编译错误与 IMPLEMENT_DYNCREATE

将 /EHa 添加到使用 Microsoft Visual C++ 编译器的 QtCreator

对于不同版本的 Microsoft Visual C++,编译的 .lib 文件是不是可以互换?

在不安装 Visual Studio 的情况下使用 Microsoft C++ 编译器

Microsoft Visual C++ 中的 SFINAE constexpr 错误