为啥我的 gcc 编译器不能识别 bzip2 函数,但允许我包含它们所属的库?

Posted

技术标签:

【中文标题】为啥我的 gcc 编译器不能识别 bzip2 函数,但允许我包含它们所属的库?【英文标题】:Why doesn't my gcc compiler recognize the bzip2 functions, yet allows me to include the library they belong to?为什么我的 gcc 编译器不能识别 bzip2 函数,但允许我包含它们所属的库? 【发布时间】:2020-06-06 02:01:51 【问题描述】:

我正在使用 MSYS2 在 Windows 上使用 gcc 在 C 中编写文件解析器。

使用 pacman 我下载了the required libraries 用于使用libbzip2。

出于某种原因,我可以包含 bzlib.h 文件并使用它包含的结构,但不能使用它的功能。

到目前为止,这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <bzlib.h>

void init_decompress_stream(bz_stream *stream, char *next_in, unsigned int avail_in, char *next_out, unsigned int avail_out);

int main()
  // Open FILE
  FILE *ptr;
  ptr = fopen("example.bin", "rb");

  // Read Metadata
  int metadata[10];
  fread(metadata, sizeof(int), 10, ptr);

  // Init stream
  bz_stream *stream;
  unsigned int avail_in = metadata[0] * sizeof(char);
  unsigned int avail_out = metadata[1] * sizeof(int);
  char *compressed_data = malloc(avail_in);
  char *data = malloc(avail_out);

  // Read data
  fread(compressed_data, 1, avail_in, ptr);
  init_decompress_stream(stream, compressed_data, avail_in, data, avail_out);

  // Decompress data -- COMPILES FINE UNTIL HERE --
  int bz_result = BZ2_bzDecompressInit(stream, 0, 0);


void init_decompress_stream(bz_stream *stream, char *next_in, unsigned int avail_in, char *next_out, unsigned int avail_out)
  stream->next_in = next_in;
  stream->avail_in = avail_in;
  stream->next_out = next_out;
  stream->avail_out = avail_out;

这一切都可以正常编译,直到 main 的最后一行:int bz_result = BZ2_bzDecompressInit(stream, 0, 0);

当我使用编译时,我得到了错误:

C:/msys64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\User Name\AppData\Local\Temp\cct30tb5.o:test.c(.text+0xc4): undefined reference to 'BZ2_bzDecompressInit'

collect2.exe: error: ld returned 1 exit status

在进行故障排除时,我使用了三种不同的编译命令:

gcc test.c 这会编译 #include &lt;bzlib.h&gt;bz_stream *stream; 直到最后一行。

gcc test.c -L/usr/lib/libbz2.a 这执行与上面相同。

gcc test.c -libbz2这个找不到-libbz2

我完全不知道自己做错了什么。

【问题讨论】:

【参考方案1】:

在 gcc 中,-L 将目录添加到库搜索路径,-l 指定要加载的库(使用搜索路径查找)。

因此你可能需要类似的东西:

gcc test.c -L /usr/lib -l bz2

如果/usr/lib 不在库路径上,我会感到惊讶,但您可能需要指定它以防万一。并且工具链足够智能,可以在库名称前加上 lib,并根据需要为它们添加扩展名。

您应该知道gcc test.c -libbz2可能等同于gcc test.c -l ibbz2,它将寻找ibbz2不是您想要的。 p>

【讨论】:

以上是关于为啥我的 gcc 编译器不能识别 bzip2 函数,但允许我包含它们所属的库?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这段代码不能用 VS2010 和 gcc 4.8.1 编译

为啥 GCC 会在我的机器上创建额外的汇编指令?

为啥在Linux中strlwr()不能编译通过,已经查看过<string.h>,的确在头文件中没有

为啥不能用 gzip、bzip、bzip2、xz 压缩目录?

为啥 -O3 GCC Optimization 没有内联这个函数?

为啥 GCC 不能消除多个继承函数的歧义(但 clang 可以)? [复制]