为什么 crc32 值需要 -lz

Why crc32 value require -lz

提问人:user4790894 提问时间:6/22/2015 最后编辑:Sourav Ghoshuser4790894 更新时间:6/22/2015 访问量:5411

问:

我正在使用 .如果我没有在链接器选项中使用,我会收到链接器错误crc32(initial_crc_value,data,data_length);-lz

“对CRC32的未定义引用”。

我没有包括任何.那么,在哪个头文件中声明呢?为什么链接器选项足以编译?zlib.hcrc32()-lz

c 链接器 头文件 undefined-reference crc32

评论

0赞 user4790894 6/22/2015
在哪个文件中声明了 crc32()?
1赞 Eregrith 6/22/2015
@user4790894声明和执行不是一回事。如果只声明 .你必须有一个它的实现,它是在 libz.socrc32

答:

4赞 Sourav Ghosh 6/22/2015 #1

首先,在 zlib 库中声明(原型化)并在 zlib 库中定义该函数。因此,要使用 ,您需要包含标题并与库的链接。crc32()zlib.hcrc32()

现在,来回答你的问题,

1.如果我没有在链接器选项中使用-lz,我会收到链接器错误

是的,因为在链接时,如果不链接到包含函数定义的库,编译器将无法找到函数定义。crc32()zlib

2. 为什么链接器选项 -lz 足以编译?

说实话,这还不够,它应该产生错误。但是,您的代码在没有头文件的情况下工作(编译),这是因为编译器(可悲的是,仍然)支持函数的隐式声明。如果启用适当的警告,编译器至少会警告您有关此问题。


关于函数的“隐式声明”,情况是,如果编译器遇到一个函数调用,而它还没有看到原型(换句话说,没有关于函数定义的信息),它假设函数的返回类型是用 的 定义,并接受任意数量的参数。您可以在相关答案中阅读更多相关信息int

评论

0赞 user4790894 6/22/2015
如何在 gcc 中启用适当的警告?
0赞 user4790894 6/22/2015
如果编译器将函数视为隐式声明,那么函数的实现是什么?它是否与 libz.so 链接?
0赞 Sourav Ghosh 6/22/2015
@user4790894请参阅文章。然而。大多数时候,添加到你的编译语句中将起到警告你几乎所有可能的陷阱的作用。-Wall
0赞 Sourav Ghosh 6/22/2015
@user4790894即使使用隐式声明,如果您与库链接,在编译时它也会找到相同的函数。但是,如果函数签名不同(即返回其他任何内容),则使用返回值。它将调用未定义的行为int