使用MinGW在Windows上静态链接到libarchive

Statically linking to libarchive on Windows with MinGW

本文关键字:链接 libarchive 静态 MinGW Windows 使用      更新时间:2023-10-16

我在项目中使用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.a显式添加到链接命令中。

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

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

目前,在我的make文件中,我有一些。。。这是有效的,但它做了一个动态链接

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