предупреждение: несовместимое неявное объявление встроенной функции "xyz" - PullRequest
154 голосов
/ 10 июня 2009

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

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

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

Ответы [ 4 ]

257 голосов
/ 10 июня 2009

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

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

Вместо stdlib.h , вам следует попробовать:

#include <string.h>

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

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

16 голосов
/ 22 июня 2011

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

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

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

11 голосов
/ 16 марта 2014

Вот код C, который выдает вышеупомянутую ошибку:

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

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

el@defiant ~/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]
el@defiant ~/foo2 $ ./n 
el@defiant ~/foo2 $ 

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

#include <stdlib.h>
7 голосов
/ 28 марта 2014

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

#define _GNU_SOURCE
#include <string.h>

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

...