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