我使用crc32(initial_crc_value,data,data_length);
生成crc32值。如果我没有在链接器选项中使用-lz
,我将收到链接器错误
“对crc32的未定义引用”。
我没有包含任何zlib.h
。那么,在哪个头文件crc32()
被声明?为什么链接器选项-lz
足以编译?
答案 0 :(得分:2)
首先,crc32()
函数在zlib.h
中声明(原型)并在zlib
库中定义。因此,要使用crc32()
,您需要包含标题和链接库。
现在,回答你的问题,
1。 如果我在链接器选项中没有使用
-lz
,我收到链接器错误
是的,因为在链接时,如果没有链接到包含函数定义的crc32()
库,编译器将无法找到zlib
函数定义。
2. 为什么链接器选项
-lz
足以编译?
说实话,这还不够,应该产生错误。但是,您的代码工作(编译)没有头文件,因为编译器支持函数的隐式声明(遗憾,仍然)。如果你启用了正确的警告,你的编译器至少会警告你这个问题。
关于函数的“隐式声明”,情节是,如果编译器遇到一个函数调用,它还没有看到一个原型(In换句话说,没有关于函数定义的信息),它假定函数定义为返回类型int
并接受任意数量的参数。您可以在related answer