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

C++ 使用MinGW在Windows上静态链接到libarchive,c++,dll,mingw,shared-libraries,static-libraries,C++,Dll,Mingw,Shared Libraries,Static Libraries,我在我的项目中使用libarchive已经有一段时间了,它工作得很好,目前我正在动态链接到它,因此在Windows上libarchive.dll文件必须显示在系统上。 我现在想静态链接到库,这样我就不必麻烦分发DLL了,但我在尝试实现这一点时遇到了真正的困难 目前,在我的make文件中,我有如下内容: -Lpath/to//libarchive/-larchive 这是可行的,但它有一个动态链接。我不知道如何强制执行静态链接 我可以在libarchive目录中看到两个a文件,libarchive

我在我的项目中使用libarchive已经有一段时间了,它工作得很好,目前我正在动态链接到它,因此在Windows上libarchive.dll文件必须显示在系统上。 我现在想静态链接到库,这样我就不必麻烦分发DLL了,但我在尝试实现这一点时遇到了真正的困难

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

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

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

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

如何从libarchive生成.lib文件。另外,作为一个额外的问题,a文件和lib文件之间的区别是什么

更新

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

-Lpath/to//libarchive/-larchive\u static

这将链接到libarchive\u static.a文件。但是,您还需要在代码中定义LIBARCHIVE\u STATIC

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

对“BZ2_bzcompression”的未定义引用

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

-Lpath/to/bzip2/-lbzip2


您可以从源代码构建bzip2,也可以通过简单的方式从Gnu32Win项目中获取预构建的二进制文件:

只需将
libarchive\u static.a
显式添加到您的link命令中即可

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之后将其添加到构建命令中是的,你是对的,我已根据更新了我的问题。我稍后会试试这个,谢谢!感谢您提供关于定义LIBARCHIVE\u STATIC的说明。