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

164

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

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

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

Алекс Рейнольдс
источник
5
Можете ли вы опубликовать код, который не работает?
МКБ
7
К сожалению, у меня нет разрешения на перепост этого кода.
Алекс Рейнольдс

Ответы:

271

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

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

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

#include <string.h>

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

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

Вилле Лаурикари
источник
Спасибо, у меня есть около 20 файлов .c для очистки и пропустил добавление некоторых заголовков.
Алекс Рейнольдс
Решил мою проблему при попытке скомпилировать C программу для проверки типа виртуализации (Xen HVM / KVM / VMware / Bare Metal), круто! Спасибо.
Терри Ван
16

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

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

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

Brandon
источник
10

Вот код 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>
Эрик Лещинский
источник
6
Прочитайте вопрос; он уже упомянул добавление stdlib.h. Но этого достаточно для выхода, а не для строковых функций.
Мэтт Флетчер
7

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

#define _GNU_SOURCE
#include <string.h>

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

ajlittoz
источник