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

问题描述 投票:1回答:1

我在Windows上用gcc编写一个文件解析器,使用MSYS2。

我用pacman下载了 所需库 用于使用 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);

当我用using编译的时候,这时我得到了错误信息。

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 <bzlib.h>bz_stream *stream; 就好了,直到最后一行。

gcc test.c -L/usr/lib/libbz2.a 这个和上面的执行情况一样。

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

我完全不明白自己做错了什么。

c gcc msys pacman-package-manager
1个回答
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, 你想要的东西。

© www.soinside.com 2019 - 2024. All rights reserved.