Visual Studio静态链接为独立的exe

Visual Studio静态链接为独立的exe

问题描述:

我已经阅读了关于这个主题的多个职位,但他们都没有让我建立一个静态链接的EXE。Visual Studio静态链接为独立的exe

在我释放配置(64),我有以下几点:

Configuration Properties -> General : Use of MFC - Use MFC in a Static Library

Configuration Properties -> C/C++ -> Code Generation : Runtime Library - Multi-threaded (/MT)

Configuration Properties -> Linker -> Command Line : Additional Options - I have all the required Windows libs "kernel32.lib", etc. (as use of MFC removed them from the "All Options" window above)

Configuration Properties -> Manifest Tool -> Input and Output : Embed Manifest - No

注意,在Configuration Properties -> Linker -> Input在我的项目中有5个lib文件,例如glfw3.lib,我正在使用完全优化(/ Ox)。

建设项目和运行的exe自己后,我收到错误“的代码执行无法继续,因为glfw3.dll没有找到......”

使用dependencywalker我可以看到,它需要与libs相关的dll,它当然找不到。

我误解了如何做到这一点,或者是否有其他的东西可能是错的?

(我正在使用Visual Studio 2017)

是的,看起来你有轻微的误解。

如果某个东西是作为DLL提供的,那么它就是用作DLL。可能有某种方法将DLL合并到可执行文件中,但这将是一种黑客攻击。这不是应该如何工作的。

您正在链接的lib文件只是为了向您提供可以链接的函数,而这些函数除了委托给动态加载的DLL中的相应函数之外什么都不做。没有它,你将不得不自己找到DLL的每个入口点,这将是完全可行的,但有点麻烦。

因此:您必须找到一个glfw3版本,该版本被打包为一个静态可链接库(我不知道是否存在)或者需要将您的.exe与glfw3.dll一起发货。

+0

我如何知道使用的第三方库是否可以静态链接;动态使用lib文件和dll,静态的呢? – Alexander

+1

通常,这些信息应该由图书馆的供应商提供。但作为一个经验法则,如果有两个.lib文件,一个小,一个大,那么大文件用于静态链接。如果只有一个.lib文件,并且它比.dll文件小得多,那么它是用于动态链接的。 –