【问题标题】:Statically linking to libarchive on Windows with MinGW使用 MinGW 静态链接到 Windows 上的 libarchive
【发布时间】:2012-07-26 10:29:39
【问题描述】:

我已经在我的项目中使用 libarchive 一段时间了,它运行良好,目前我正在动态链接到它,所以在 Windows 上,libarchive.dll 文件必须存在于系统上。 我现在想静态链接到库,这样我就不必费心分发 DLL,但我在尝试实现这一点时遇到了真正的麻烦!

目前,在我的 make 文件中,我有这样的内容: -Lpath/to//libarchive/ -larchive

这是可行的,但它确实是一个动态链接。我不知道如何强制执行静态链接。

我可以看到在 libarchive 目录中有两个 a 文件,libarchive.dll.a 和 libarchive_static.a。我想我想链接到 libarchive_static.a 但我似乎无法指定这一点,在 make 文件中执行 -larchive_static 会导致链接器错误。

我的印象是windows下的静态库是lib文件,但是我构建libarchive时没有得到这种文件类型。

如何从 libarchive 创建一个 .lib 文件。另外,作为一个额外的问题,a 文件和 lib 文件有什么区别?

更新

要静态链接到 libarchive,您的 make 库命令应包含:

-Lpath/to//libarchive/ -larchive_static

这将链接到 libarchive_static.a 文件。但是,您还需要在代码中定义 LIBARCHIVE_STATIC。

现在的问题是 libarchive 依赖于 bzip2 库(以及其他库),如果您没有它们的静态构建,您将收到如下链接器错误:

对 `BZ2_bzCompressInit' 的未定义引用

在 libarchive 命令之后,您需要依赖库的静态构建和与链接器类似的命令:

-Lpath/to/bzip2/-lbzip2

您可以从源代码构建 bzip2,也可以通过简单的方法从 Gnu32Win 项目中获取预构建的二进制文件:http://gnuwin32.sourceforge.net/packages.html

【问题讨论】:

  • 感谢您提供定义 LIBARCHIVE_STATIC 的说明。

标签: c++ dll mingw shared-libraries static-libraries


【解决方案1】:

只需将libarchive_static.a 明确添加到您的链接命令中即可。

gcc -o YourApp.exe $(OBJS) path/to/libarchive_static.a $(OtherLibs)

“.lib”文件因编译器而异(Borland、Microsoft 等),“.a”是 UNIX 的 ar 工具的旧“归档”格式。它现在仅用于捆绑静态库。

目前,在我的 make 文件中,我有一些东西...... 这行得通,但它有一个动态链接

.a 文件实际上包含一些用于动态链接到 .dll 文件的代码,而不是 libarchive 本身。在启动时分配指向函数的指针并完成动态链接。

【讨论】:

  • 刚试过这个,我得到链接器错误,说我在库中使用的函数有一个未定义的引用。这意味着什么?
  • 这意味着 libarchive 依赖于其他东西。我打赌这些是 zlib、libzip2 等。你有这些的静态版本吗?获取 .a 文件并将它们添加到 libarchive_static.a 到您的构建命令中
  • 是的,你是对的,我已经按照要求更新了我的问题。我稍后会试试这个,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 2020-11-04
  • 2017-01-06
相关资源
最近更新 更多