我是C语言新手的Python开发人员,需要在Windows和Linux上运行Windows上的C代码。
为此,我下载了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”程序可以编译并很好地执行。
安装列出的所有二进制软件包here并将标头文件名更改为bzlib.h
解决了该问题。
简短版本:假定您正在使用MSYS目标pacman -S libbz2-devel
。
Long version:在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
目标,否则将不会出现此问题。