몇 가지 바이너리를 컴파일 할 때 다음과 같은 경고가 나타납니다.
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
이러한 경고를 해결하려면 어떻게해야합니까?
답변
C에서 이전에 선언되지 않은 함수를 사용하는 것은 함수의 암시 적 선언을 구성합니다. 암시 적 선언에서 반환 유형은 int
올바르게 기억하는 경우입니다. 이제 GCC에는 일부 표준 기능에 대한 정의가 내장되어 있습니다. 암시 적 선언이 내장 정의와 일치하지 않으면이 경고가 표시됩니다.
문제를 해결하려면 함수를 사용하기 전에 선언해야합니다. 일반적으로 적절한 헤더를 포함하여이 작업을 수행합니다. -fno-builtin-*
가능 하면 플래그 를 사용하지 않는 것이 좋습니다 .
stdlib.h 대신 다음을 시도해야합니다.
#include <string.h>
그건 어디 strcpy
하고 strncpy
, 정의 된에 따라 적어도 strcpy
(2) 매뉴얼 페이지를 참조하십시오.
exit
기능에 정의되어 stdlib.h 내가 거기에 무슨 일이 일어나고 있는지 모르는, 그래서하지만.
답변
일부 프로그램의 경우 이러한 오류는 정상이므로 수정해서는 안됩니다.
프로그램 phrap을 컴파일 할 때 이러한 오류 메시지가 나타납니다 (예 :). 이 프로그램에는 일부 내장 함수를 수정하거나 대체하는 코드가 포함되어 있으며 경고를 해결하기 위해 적절한 헤더 파일을 포함 시키면 GCC가 대신 많은 오류를 생성합니다. 따라서 경고를 수정하면 빌드가 효과적으로 중단됩니다.
정상적으로 컴파일해야하는 분배의 일부로 소스를 확보 한 경우 오류가 정상일 수 있습니다. 설명서를 참조하여 확인하십시오.
답변
위에서 언급 한 오류를 생성하는 일부 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>
답변
나는 mempcpy
기능 에 관한이 경고들을 만났다 . 매뉴얼 페이지에 따르면이 기능은 GNU 확장이며 시놉시스는 다음을 보여줍니다.
#define _GNU_SOURCE
#include <string.h>
#define
가 내 소스에 추가 되면 #include
GNU 확장에 대한 선언이 표시되고 경고가 사라집니다.