【问题标题】:Compiling a static lib inside a exe在 exe 中编译静态库
【发布时间】:2009-12-14 22:19:45
【问题描述】:

我有一个 dll 和一个 exe,我都有源代码。

对于DLL,我已经完全静态编译,因此,我假设.lib 也是静态的。但是,当我在 Linker > Input > Additional Dependencies 下的 C++ VC++ 2008 项目中包含 lib 时。我将 exe 的编译模式设置为 /MT(多线程)。

一切都可以编译,但是当我尝试运行 exe 时,它​​要求提供 dll!据我(有限的)理解,这不应该发生。

我为什么要这样做?

【问题讨论】:

    标签: c++ c dll linker


    【解决方案1】:

    您所指的“编译模式”设置是与您生成的任何库或可执行文件链接的运行时库的设置。

    如果您的项目设置为生成 DLL(检查主项目页面),那么无论您将什么放入运行时库设置,它仍然会生成 DLL。我认为您想要做的是将 DLL 的主项目页面上的设置从 DLL 更改为静态库,而不是更改运行时库设置。

    完成此操作后,请确保可执行文件和库项目具有相同的运行时库设置(您引用的 /MT 开关),否则如果链接器正在尝试,您将收到大量奇怪的错误消息在同一个可执行文件中匹配两个不同的运行时库。

    【讨论】:

    • 嗯...这似乎有道理...我现在正在尝试。
    • 我无法将 makefile 从 DLL 更改为静态库。
    • 我现在有一个静态库。我把它作为一个额外的依赖,当我启动它时它仍然要求 DLL。
    • 清除所有旧的编译结果,并检查是否有一个旧 DLL 的副本,您无意中链接到该副本。
    • 我刚刚用其他两个简单的项目对其进行了测试,并且效果很好。我认为在我当前的项目中有些东西太复杂了(它相当复杂),所以我会在这个周末花时间来修复它。
    【解决方案2】:

    使用“静态”DLL 创建的 .lib 文件只是一个导入库,用于处理与库中所有符号的自动动态链接。 DLL 本身(即 .dll 文件)仍然包含所有代码/符号/等。你所期望的。

    静态链接到 .lib 文件只是让您免于手动调用 LoadLibrary()/GetProcAddress() 等来解析 DLL 中的符号。

    除非您构建一个真正的静态库(即包含所有符号和代码,而不仅仅是导入),否则您仍然需要 DLL 本身。

    【讨论】:

    • 啊。感谢您的解释。现在我只需要将我的项目重新配置为静态库而不是 dll。
    • 我将静态库作为依赖项,它仍然要求 DLL。
    • @Ramblingwood:听起来您仍在构建 DLL + 静态导入库,而不是静态代码库。除非您这样做,否则您将无法摆脱 DLL。
    • 我不是,只输出了一个.lib,并且项目中引用了那个lib。正如我上面所说的:我刚刚用其他两个简单的项目对其进行了测试,并且效果很好。我认为在我当前的项目中有些东西太复杂了(它相当复杂),所以我会在这个周末花时间来修复它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多