Я получаю ряд этих предупреждений при компиляции нескольких двоичных файлов:
warning: incompatible implicit declaration of built-in function ‘strcpy’
warning: incompatible implicit declaration of built-in function ‘strlen’
warning: incompatible implicit declaration of built-in function ‘exit’
Чтобы попытаться решить эту проблему, я добавил
#include <stdlib.h>
вверху файлов C, связанных с этим предупреждением, помимо компиляции со следующими флагами:
CFLAGS = -fno-builtin-exit -fno-builtin-strcat -fno-builtin-strncat -fno-builtin-strcpy -fno-builtin-strlen -fno-builtin-calloc
Я использую GCC 4.1.2:
$ gcc --version
gcc (GCC) 4.1.2 20080704
Что я должен сделать, чтобы устранить эти предупреждения?
c
gcc
gcc-warning
Алекс Рейнольдс
источник
источник
Ответы:
В C использование ранее необъявленной функции представляет собой неявное объявление функции. В неявном объявлении типом возврата является,
int
если я правильно помню. Теперь GCC имеет встроенные определения для некоторых стандартных функций. Если неявное объявление не соответствует встроенному определению, вы получите это предупреждение.Чтобы решить проблему, вы должны объявить функции перед их использованием; обычно вы делаете это путем включения соответствующего заголовка. Я рекомендую не использовать
-fno-builtin-*
флаги, если это возможно.Вместо stdlib.h вы должны попробовать:
Вот где
strcpy
иstrncpy
определены, по крайней мере, согласноstrcpy
справочной странице (2).Однако эта
exit
функция определена в stdlib.h , поэтому я не знаю, что там происходит.источник
В случае некоторых программ эти ошибки являются нормальными и не должны быть исправлены.
Я получаю эти сообщения об ошибках при компиляции программы phrap (например). Эта программа содержит код, который модифицирует или заменяет некоторые встроенные функции, и когда я включаю соответствующие заголовочные файлы для исправления предупреждений, вместо этого GCC генерирует кучу ошибок. Таким образом, исправление предупреждений эффективно нарушает сборку.
Если вы получили исходный код как часть дистрибутива, который должен нормально компилироваться, ошибки могут быть нормальными. Обратитесь к документации, чтобы быть уверенным.
источник
Вот код C, который выдает вышеупомянутую ошибку:
Скомпилировано так на Fedora 17 Linux 64 bit с gcc:
Чтобы убрать предупреждение, добавьте эту декларацию в начало файла:
источник
Я встретил эти предупреждения на
mempcpy
функции. Страница Man говорит, что эта функция является расширением GNU, и краткий обзор показывает:Когда
#define
он добавляется в мой источник до#include
, объявления для расширений GNU становятся видимыми, а предупреждения исчезают.источник