为什么我的 gcc 编译器不能识别 bzip2 函数,但允许我包含它们所属的库?
Why doesn't my gcc compiler recognize the bzip2 functions, yet allows me to include the library they belong to?
我正在 Windows 使用 MSYS2 使用 gcc 在 C 中编写文件解析器。
使用 pacman 我已经下载 for using 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 <bzlib.h>
和 bz_stream *stream;
直到最后一行。
gcc test.c -L/usr/lib/libbz2.a
这与上面的执行相同。
gcc test.c -libbz2
这个找不到-libbz2
我完全不知道自己做错了什么。
在gcc中,-L
在库搜索路径中添加目录,-l
指定要加载的库(使用搜索路径查找)。
因此你可能需要这样的东西:
gcc test.c -L /usr/lib -l bz2
如果 /usr/lib
不在库路径中,我会感到惊讶,但您可能需要指定它以防万一。而且工具链足够智能,可以在您的库名称前加上 lib
前缀,并根据需要在它们后缀上扩展名。
您应该知道 gcc test.c -libbz2
可能 等同于 gcc test.c -l ibbz2
将要寻找 ibbz2
, 不是你想要的。
我正在 Windows 使用 MSYS2 使用 gcc 在 C 中编写文件解析器。
使用 pacman 我已经下载
出于某种原因,我可以包含 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 <bzlib.h>
和 bz_stream *stream;
直到最后一行。
gcc test.c -L/usr/lib/libbz2.a
这与上面的执行相同。
gcc test.c -libbz2
这个找不到-libbz2
我完全不知道自己做错了什么。
在gcc中,-L
在库搜索路径中添加目录,-l
指定要加载的库(使用搜索路径查找)。
因此你可能需要这样的东西:
gcc test.c -L /usr/lib -l bz2
如果 /usr/lib
不在库路径中,我会感到惊讶,但您可能需要指定它以防万一。而且工具链足够智能,可以在您的库名称前加上 lib
前缀,并根据需要在它们后缀上扩展名。
您应该知道 gcc test.c -libbz2
可能 等同于 gcc test.c -l ibbz2
将要寻找 ibbz2
, 不是你想要的。