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

标签 c++ dll mingw shared-libraries static-libraries

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

在 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)

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

Currently, in my make file, I have something ... And this works, but it does a dynamic link

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

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

相关文章:

c++ 继承 Building 方法

c++ - 使用 C++、Openssl 和 aes 加密和解密字符串

windows - x86 - Windows 是否将 dll 映射到不同进程中的同一物理页面?

c++ - OpenCV 和 MinGW 的运行时错误?

c++ - 如何检测当前的屏幕分辨率?

c++ - 如何评估交换机中的QChar对象?

c++ - 我在使用 ifndef 时遇到问题。我收到错误 : error undefined reference

c# - Libsodium-net - 无法加载 DLL 'libsodium.dll

C popen fwrite缓冲区问题

MinGW 的 mingw-get 下载包失败