提问人:user4790894 提问时间:6/22/2015 最后编辑:Sourav Ghoshuser4790894 更新时间:6/22/2015 访问量:5411
为什么 crc32 值需要 -lz
Why crc32 value require -lz
问:
我正在使用 .如果我没有在链接器选项中使用,我会收到链接器错误crc32(initial_crc_value,data,data_length);
-lz
“对CRC32的未定义引用”。
我没有包括任何.那么,在哪个头文件中声明呢?为什么链接器选项足以编译?zlib.h
crc32()
-lz
答:
4赞
Sourav Ghosh
6/22/2015
#1
首先,在 zlib 库中声明(原型化)并在 zlib
库中定义该函数。因此,要使用 ,您需要包含标题并与库的链接。crc32()
zlib.h
crc32()
现在,来回答你的问题,
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即使使用隐式声明,如果您与库链接,在编译时它也会找到相同的函数。但是,如果函数签名不同(即返回其他任何内容),则使用返回值。它将调用未定义的行为。int
评论
crc32