我如何在我的 gcc 编译器中 link 第三方库 bzip2?

How can I link the 3rd party library bzip2 in my gcc compiler?

我是一名 python 的 C 开发新手,正在 Windows 上开发需要在 Windows 和 Linux 上工作的 C 代码。

为此,我下载了 MSYS2 and used pacman to install gcc and 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

我包含了正确的头文件吗?我链接正确吗?

当不使用第 3 方库时,一个简单的 "hello world" 程序可以正常编译和执行。

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

简短版本:假设您使用的是 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(构建依赖于 MSYS DLL 和运行时环境的 Win32 或 Win64 应用程序,使用自定义 GCC 端口和运行时库,并支持大量 POSIX 功能)。

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

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

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

  • bzip2 是在 shell
  • 中使用 bzip2 的二进制文件
  • libbz2 是一个共享对象二进制文件 (DLL)
  • libbz2-devel 是您需要 link bzip2 到您的程序中的头文件和静态库。

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

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

我假设您使用的是 msys 目标,否则就不会出现这个问题。