Visual Studio静态链接用于独立的可执行文件

3
我已阅读多篇与此主题相关的文章,但都没有使我能够构建静态链接的exe文件。
在我的发布配置(x64)中,我有以下设置:
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 - 我拥有所有必需的Windows库“kernel32.lib”等(因为使用MFC会将它们从上面的“All Options”窗口中移除)
Configuration Properties -> Manifest Tool -> Input and Output : Embed Manifest - No
请注意,在Configuration Properties -> Linker -> Input中,我正在使用5个lib文件,例如glfw3.lib,并且我正在使用完全优化(/Ox)。
构建项目并运行exe后,我收到错误信息:“代码执行无法继续,因为找不到glfw3.dll”等。
使用dependencywalker,我可以看到它需要与libs关联的dlls,而它当然找不到。
我是否误解了如何做这件事,或者还有其他可能出错的地方?
(我使用Visual Studio 2017)
1个回答

3
是的,看起来你有一些误解。
如果某个东西被提供为 DLL,则意味着该 DLL 应该被用作 DLL。可能有一些方法可以将 DLL 合并到可执行文件中,但这是一种欺骗方式。不应该这样工作。
您链接的 lib 文件存在只是为了向您提供可以链接的函数,而这些函数仅仅是委托给动态加载的 DLL 中对应的函数。没有它,您将不得不自行定位 DLL 的每个入口点,这是完全可行的,但有点麻烦。
所以:您必须找到一个打包为静态库的 glfw3 版本(我不知道是否存在这样的版本),或者接受这样一个事实,即您的 .exe 必须与 glfw3.dll 一起发货。

如何判断所使用的第三方库是否支持静态链接?动态链接通常使用.lib文件和.dll文件,那么静态链接呢? - undefined
1
通常,这些信息应该由库的供应商提供。但是作为一个经验法则,如果有两个.lib文件,一个小的,一个大的,那么大的文件用于静态链接。如果只有一个.lib文件,并且它比.dll文件要小得多,那么它就是用于动态链接的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接