C语言 如何在 gcc 编译器中链接第三方库 bzip2?



我是一个刚接触C的python开发人员,在Windows上开发C代码,需要在Windows和Linux上运行。

为此,我下载了MSYS2并使用pacman来安装gcc和bz2。

我的问题是:如何在 C 代码中使用 bzip2。

当我尝试编译此 C 代码时:

#include <bzlib.h>

使用命令gcc test.c -lbzip2 -o test.out我收到以下错误:

test.c:1:10: fatal error: bzlib.h: No such file or directory

我是否包含正确的头文件?我是否正确链接了它?

不使用第三方库时,一个简单的"hello world"程序可以很好地编译和执行。

简短版本:假设您使用的是 MSYS 目标,pacman -S libbz2-devel.


长版本:在MSYS2中,您可以使用以下方法找到哪个软件包包含文件:

pacman -F bzlib.h

答案是:

mingw32/mingw-w64-i686-bzip2 1.0.8-1 [installed]
mingw32/include/bzlib.h
mingw64/mingw-w64-x86_64-bzip2 1.0.8-1 [installed]
mingw64/include/bzlib.h
msys/libbz2-devel 1.0.8-1 (development)
usr/include/bzlib.h

若要解释此输出,请首先了解 MSYS2 安装支持三个不同的开发目标:

  • mingw32(使用 mingw-w64 构建本机 Win32 应用程序(
  • mingw64(使用 mingw-w64 构建本机 Win64 应用程序(
  • msys(使用自定义 GCC 端口和运行时库构建依赖于 MSYS DLL 和运行时环境的 Win32 或 Win64 应用程序,并支持许多 POSIX 功能(。

安装 MSYS2 时,您将在"开始"菜单中获得三个启动脚本,每个环境一个。

上面pacman -F的输出告诉我们,对于目标mingw32mingw64,包bzip2包含使用 bzip 进行开发所需的文件。但是,在msys目标上,需要包libbz2-devel

这是msys和各种 *nix 包管理器中常见的软件包布局(MSYS2 pacman 是 ArchLinux pacman 的一个端口(:

  • bzip2是在shell中使用bzip2的二进制文件
  • libbz2是共享对象二进制文件 (DLL(
  • libbz2-devel是将 bzip2 链接到程序中所需的头文件和静态库。

您可以使用pacman -F --list libbz2-devel等列出每个包的文件。

mingw32/mingw64 目标通常具有单个包,在一个包中包含所有这三个内容,例如pacman -F --list mingw64/mingw-w64-x86_64-bzip2.

我假设您正在使用msys目标,否则不会出现此问题.

安装此处列出的所有二进制包并更改头文件名以bzlib.h解决了问题。

最新更新