경고 : 내장 함수 '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
불행히도이 코드를 다시 게시 할 권한이 없습니다.
Alex Reynolds

답변:


271

C에서 이전에 선언되지 않은 함수를 사용하는 것은 함수의 암시 적 선언을 구성합니다. 암시 적 선언에서 반환 유형은 int올바르게 기억하는 경우입니다. 이제 GCC에는 일부 표준 기능에 대한 정의가 내장되어 있습니다. 암시 적 선언이 내장 정의와 일치하지 않으면이 경고가 표시됩니다.

문제를 해결하려면 함수를 사용하기 전에 선언해야합니다. 일반적으로 적절한 헤더를 포함하여이 작업을 수행합니다. -fno-builtin-*가능 하면 플래그 를 사용하지 않는 것이 좋습니다 .

stdlib.h 대신 다음을 시도해야합니다.

#include <string.h>

그건 어디 strcpy하고 strncpy, 정의 된에 따라 적어도 strcpy(2) 매뉴얼 페이지를 참조하십시오.

exit기능에 정의되어 stdlib.h 내가 거기에 무슨 일이 일어나고 있는지 모르는, 그래서하지만.


감사합니다. 약 20 개의 .c 파일이있어서 헤더를 추가하지 못했습니다.
Alex Reynolds

가상화 유형 (Xen HVM / KVM / VMware / Bare Metal)을 확인하기 위해 C 프로그램을 컴파일하려고 할 때 문제가 해결되었습니다. 감사.
Terry Wang

16

일부 프로그램의 경우 이러한 오류는 정상이므로 수정해서는 안됩니다.

프로그램 phrap을 컴파일 할 때 이러한 오류 메시지가 나타납니다 (예 :). 이 프로그램에는 일부 내장 함수를 수정하거나 대체하는 코드가 포함되어 있으며 경고를 해결하기 위해 적절한 헤더 파일을 포함 시키면 GCC가 대신 많은 오류를 생성합니다. 따라서 경고를 수정하면 빌드가 효과적으로 중단됩니다.

정상적으로 컴파일해야하는 분배의 일부로 소스를 확보 한 경우 오류가 정상일 수 있습니다. 설명서를 참조하여 확인하십시오.


10

위에서 언급 한 오류를 생성하는 일부 C 코드는 다음과 같습니다.

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

gcc를 사용하여 Fedora 17 Linux 64 비트에서 다음과 같이 컴파일되었습니다.

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기능 에 관한이 경고들을 만났다 . 매뉴얼 페이지에 따르면이 기능은 GNU 확장이며 시놉시스는 다음을 보여줍니다.

#define _GNU_SOURCE
#include <string.h>

#define가 내 소스에 추가 되면 #includeGNU 확장에 대한 선언이 표시되고 경고가 사라집니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.