【问题标题】:Visual Studio Static Linking for Standalone Exe独立 Exe 的 Visual Studio 静态链接
【发布时间】:2017-07-31 22:09:15
【问题描述】:

我已经阅读了多篇关于这个主题的帖子,但没有一篇能让我构建静态链接的 exe。

在我的 release 配置 (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 - 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我可以看到它需要与库关联的dll,当然找不到。

我是否误解了如何执行此操作,或者是否还有其他问题?

(我使用的是 Visual Studio 2017)

【问题讨论】:

    标签: c++ visual-studio exe static-linking


    【解决方案1】:

    是的,看来你有点误会了。

    如果某些东西以 DLL 的形式提供,那么它就意味着用作 DLL。可能有一些方法可以将 DLL 合并到可执行文件中,但这将是一种 hack。事情不是这样运作的。

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

    所以:您必须要么找到打包为静态可链接库的 glfw3 版本(我不知道是否存在),要么接受您的 .exe 需要与 glfw3.dll 一起发布的事实。

    【讨论】:

    • 我怎么知道使用的第三方库是否是静态可链接的;动态使用lib文件和dll,静态的呢?
    • 一般情况下,此信息应由库的供应商提供。但是根据经验,如果有两个 .lib 文件,一个小的,一个大的,那么大的一个用于静态链接。如果.lib 文件只有一个,而且比.dll 文件小很多,则为动态链接。
    猜你喜欢
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多