我是一个刚接触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
的输出告诉我们,对于目标mingw32
和mingw64
,包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
解决了问题。