【问题标题】:Linking a lib statically in VC++在 VC++ 中静态链接库
【发布时间】:2014-04-28 14:59:14
【问题描述】:

可能我在这里遗漏了一些东西,但这是我第一次在 Windows 上需要静态链接库,以便可执行文件不依赖于 dll。我使用 LIBPNG 来完成。

我是这样做的:

  1. 我添加了 libpng 头文件:C/C++ -> Additional Include Directories

  2. 将库目录添加到链接器:链接器 -> 常规 -> 其他图书馆目录

  3. 添加链接器附加依赖:链接器 -> 输入

编译exe ok。调用它时我得到:

“程序无法启动,因为您的文件中缺少 libpng16.dll 电脑。”

这意味着 libpng 尚未编译到可执行文件中。如果没有reference the whole pnglib project code into my executable project,我该如何解决?

【问题讨论】:

  • 错误中的 "libpng16.dll" 表示这不是静态库,而是动态链接库。如果您只是将 dll 复制到与可执行文件相同的文件夹中,您可能会很好。否则,您需要确保库确实支持静态链接,然后链接到 正确的 .lib 文件。
  • @crashmstr 我不想这样做。我希望将 libpng 编译到最终程序中。
  • 我编辑了我的评论以包含您需要确保的声明:1. libpng 支持静态链接和 2. 您链接到正确的 .lib,即静态库而不是“点”指向 dll。
  • @crashmstr 1. - 是我现在想要弄清楚的,但我还想确保我的 VS 设置正确。

标签: c++ visual-c++ visual-studio-2012 linker


【解决方案1】:

在 Windows 上,.lib 是一个库文件,通常它只包含加载 dll、查找导出的函数并为其提供包装器的代码。但是,您可以以不同的方式构建 lib,以便它包含实际的二进制代码,而不是这些包装存根。 .lib 的操作和结构是相同的——它包含什么代码取决于它的构建方式。

因此,如果您将 libpng16 构建为“动态”lib/dll 对,那么在部署它时将需要 dll 部分。如果您仅将其构建为“静态”库,那么您将得到您想要的。

关键是 - 您首先需要以您想要的格式构建库。不可能将 lib/dll 对转换为静态库,也不可能将 dll 合并到可执行文件中。 (好吧,在你构建它之后不可能 - 当然,如果你更改 lib 的设置并重新编译以生成静态 lib 形式,则完全有可能)

【讨论】:

  • 嗯,我没看到,我需要弄清楚如何静态构建 libpng。
  • 是的。使用Lib.exe而不是Link.exe来生成lib。
  • 我不确定我是否得到你。
  • 点击超链接,它会告诉您用于构建静态库的设置。
  • “Lib.exe”下的那个。更改您的浏览器下划线超链接颜色!
猜你喜欢
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多