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

ogg*_*ter 7 c++ dll mingw shared-libraries static-libraries

我已经在我的项目中使用了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

Vik*_*pov 3

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

gcc -o YourApp.exe $(OBJS) path/to/libarchive_static.a $(OtherLibs)
Run Code Online (Sandbox Code Playgroud)

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

目前,在我的 make 文件中,我有一些东西......这可以工作,但它有一个动态链接

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

  • 这意味着 libarchive 依赖于其他东西。我打赌这些是 zlib、libzip2 等。你们有这些的静态版本吗?获取 .a 文件并将它们添加到 libarchive_static.a 之后到您的构建命令中 (3认同)