2015-06-22 3 views
0

Я генерирую значение crc32 с помощью crc32(initial_crc_value,data,data_length);. если я не использую -lz в вариантах компоновщика, я получаю ошибку компоновщика какЗачем нужно значение crc32 -lz

«неопределенная ссылка на crc32».

У меня не было zlib.h. Итак, в чем объявлен заголовочный файл crc32()? Зачем нужен компоновщик -lz?

+0

В каком объявлении объявлен crc32()? – user4790894

+1

@ user4790894 декларация и реализация - это не одно и то же. Вы не можете компилировать, если вы просто * объявляете * 'crc32'. У вас должна быть * реализация *, которая находится в libz.so – Eregrith

ответ

2

Во-первых, функция crc32() объявлена ​​(прототипирована) в zlib.h и определена в библиотеке zlib. Итак, чтобы использовать crc32(), вам нужно включить заголовок и ссылку с библиотекой.

Теперь, приходя на ваши вопросы,

1., если я не использую -lz в опции компоновщика, я получаю сообщение об ошибке компоновщика

Да потому, что при связывании компилятор времени не сможет найти определение функции crc32() без ссылки на библиотеку zlib, которая содержит определение функции.

2.почему вариант линкер -lz достаточно для компиляции?

Чтобы быть правдивым, оно не является достаточным, и должно быть ошибка производства. Однако ваш код работает (компилирует) без файла заголовка, из-за неявного объявления функции есть (, к сожалению, еще), поддерживаемый компилятором. Если вы включите соответствующие предупреждения, вы, по крайней мере, будете предупреждены вашим компилятором относительно этой проблемы.


Что касается «неявное объявление» функции, сценарий, если компилятор встречает вызов функции, для которых он не см прототип еще (Другими словами, нет никакой информации относительно определения функции), предполагается, что функция определена с типом возвращаемого значения int и принимает любое количество аргументов. Вы можете узнать больше об этом на related answer

+0

Как включить правильные предупреждения в gcc? – user4790894

+0

Если компилятор рассматривает функцию как неявное объявление, то какова реализация функции? это ссылка на libz.so или нет? – user4790894

+0

@ user4790894 см. Статью [this] (https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html). Однако. в большинстве случаев добавление '-Wall' в ваш оператор компиляции будет выполнять задание, предупреждающее вас о _almost_ всех _possible_ ловушках. –

 Смежные вопросы

  • Нет связанных вопросов^_^