Предупреждение: несовместимое неявное объявление встроенной функции 'xyz

Я получаю несколько этих предупреждений при компиляции нескольких двоичных файлов:

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

Что делать, чтобы разрешить эти предупреждения?

Ответ 1

В C использование ранее необъявленной функции представляет собой неявное объявление функции. В неявном объявлении возвращаемый тип int, если я правильно помню. Теперь GCC имеет встроенные определения для некоторых стандартных функций. Если неявное объявление не соответствует встроенному определению, вы получите это предупреждение.

Чтобы устранить проблему, вы должны объявить функции перед их использованием; обычно вы делаете это, включая соответствующий заголовок. Я рекомендую не использовать флаги -fno-builtin- *, если это возможно.

Вместо stdlib.h вы должны попробовать

#include <string.h>

То, где strcpy и strncpy определены, по крайней мере, согласно странице man strcpy (2).

Функция exit определена в stdlib.h, поэтому я не знаю, что там происходит.

Ответ 2

В случае некоторых программ эти ошибки являются нормальными и не должны быть исправлены.

Я получаю эти сообщения об ошибках при компиляции программы phrap (например). Эта программа содержит код, который изменяет или заменяет некоторые встроенные функции, и когда я включаю соответствующие файлы заголовков для исправления предупреждений, GCC вместо этого генерирует кучу ошибок. Поэтому исправление предупреждений эффективно разрушает сборку.

Если вы получили источник как часть дистрибутива, который должен компилироваться нормально, ошибки могут быть нормальными. Проконсультируйтесь с документацией.

Ответ 3

Ниже приведен код C, который выдает указанную выше ошибку:

int main(int argc, char **argv) {
  exit(1);
}

Скомпилирован на Fedora 17 Linux 64 бит с gcc:

[email protected] ~/foo2 $ gcc -o n n2.c                                                               
n2.c: In function ‘main’:
n2.c:2:3: warning: incompatible implicit declaration of built-in 
function ‘exit’ [enabled by default]
[email protected] ~/foo2 $ ./n 
[email protected] ~/foo2 $ 

Чтобы уведомить предупреждение, добавьте это объявление в начало файла:

#include <stdlib.h>

Ответ 4

Я встретил эти предупреждения в функции mempcpy. Man говорит, что эта функция является расширением GNU и показывает:

#define _GNU_SOURCE
#include <string.h>

Когда #define добавляется в мой источник до #include, объявления для расширений GNU становятся видимыми и предупреждения исчезают.