为什么crc32值需要-lz

时间:2015-06-22 08:04:21

标签: c linker header-files undefined-reference crc32

我使用crc32(initial_crc_value,data,data_length);生成crc32值。如果我没有在链接器选项中使用-lz,我将收到链接器错误

  

“对crc32的未定义引用”。

我没有包含任何zlib.h。那么,在哪个头文件crc32()被声明?为什么链接器选项-lz足以编译?

1 个答案:

答案 0 :(得分:2)

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

现在,回答你的问题,

  

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

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

  

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

说实话,这还不够,应该产生错误。但是,您的代码工作(编译)没有头文件,因为编译器支持函数的隐式声明(遗憾,仍然)。如果你启用了正确的警告,你的编译器至少会警告你这个问题。

关于函数的“隐式声明”,情节是,如果编译器遇到一个函数调用,它还没有看到一个原型(In换句话说,没有关于函数定义的信息),它假定函数定义为返回类型int并接受任意数量的参数。您可以在related answer

上详细了解相关信息