我如何在我的 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
的输出告诉我们,对于目标 mingw32
和 mingw64
,包 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
目标,否则就不会出现这个问题。
我是一名 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
的输出告诉我们,对于目标 mingw32
和 mingw64
,包 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
目标,否则就不会出现这个问题。