我已经在我的项目中使用libarchive一段时间了,目前我正在动态链接到它,它的工作非常好,因此在Windows上,必须在系统上显示libarchive.dll文件。
我现在想静态链接到该库,因此不必费心分发DLL,但是在实现这一点方面确实遇到了麻烦!

当前,在我的make文件中,我有类似以下内容:
-Lpath/to///libarchive/-larchive

这行得通,但是它实现了动态链接。我不知道如何强制执行静态链接。

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

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

如何从libarchive制作.lib文件。另外,还有一个问题,一个文件和一个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)

每个编译器(Borland,Microsoft等)的“.lib”文件都不相同,“。a”是UNIX的ar工具中的旧“存档”格式。现在,它仅用于捆绑静态库。



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

关于c++ - 使用MinGW在Windows上静态链接到libarchive,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11667387/

10-11 22:09