попередження: несумісне неявне декларування вбудованої функції '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
Чи можете ви розмістити код, який не вдається?
mkb

7
На жаль, я не маю дозволу на повторне оновлення цього коду.
Алекс Рейнольдс

Відповіді:


271

У C використання раніше незадекларованої функції являє собою неявне оголошення функції. У неявній декларації тип повернення - це intякщо я пам'ятаю правильно. Тепер GCC має вбудовані визначення для деяких стандартних функцій. Якщо неявна декларація не відповідає вбудованому визначенню, ви отримуєте це попередження.

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

Замість stdlib.h спробуйте:

#include <string.h>

Ось де strcpyі strncpyвизначено, принаймні відповідно до сторінки strcpy(2) man.

Однак exitфункція визначена в stdlib.h , тому я не знаю, що там відбувається.


Дякую, я маю близько 20 .c файлів для очищення та пропустив додавання деяких заголовків.
Алекс Рейнольдс

Вирішив мою проблему при спробі скласти програму C для перевірки типу віртуалізації (Xen HVM / KVM / VMware / Bare Metal), класно! Дякую.
Террі Ван

16

У випадку деяких програм ці помилки є нормальними і їх не слід виправляти.

Я отримую ці повідомлення про помилки при компілюванні програмної фрази (наприклад). Ця програма містить код, який змінює або замінює деякі вбудовані функції, і коли я включаю відповідні файли заголовків, щоб виправити попередження, GCC замість цього генерує купу помилок. Таким чином, виправлення попереджень ефективно порушує збірку.

Якщо ви отримали джерело як частину дистрибутива, який повинен складатись нормально, помилки можуть бути нормальними. Зверніться до документації.


10

Ось декілька код C, який видає згадану вище помилку:

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

Скомпільовано так у Fedora 17 Linux 64 біт з 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 стають видимими, а попередження зникають.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.