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

我一直在我的项目中使用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,或者以简单的方式创建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本身。 在启动时,分配函数指针并完成动态链接。

链接地址: http://www.djcxy.com/p/11045.html

上一篇: Statically linking to libarchive on Windows with MinGW

下一篇: javascript based code editor for custom language syntax