警告:組み込み関数 'xyz'の互換性のない暗黙の宣言

2009年06月11日に質問されました。  ·  閲覧回数 369k回  ·  ソース

Alex Reynolds picture
2009年06月11日

いくつかのバイナリをコンパイルすると、次のような警告が表示されます。

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

私はGCC4.1.2を使用しています:

$ gcc --version
gcc (GCC) 4.1.2 20080704

これらの警告を解決するにはどうすればよいですか?

回答

Ville Laurikari picture
2009年06月11日
275

Cでは、以前に宣言されていない関数を使用すると、関数の暗黙的な宣言が構成されます。 暗黙の宣言では、正しく思い出せば、戻り値の型はintです。 現在、GCCにはいくつかの標準関数の定義が組み込まれています。 暗黙の宣言が組み込みの定義と一致しない場合、この警告が表示されます。

この問題を解決するには、関数を使用する前に関数を宣言する必要があります。 通常、これを行うには、適切なヘッダーを含めます。 可能であれば、 -fno-builtin-*フラグを使用しないことをお勧めします。

stdlib.hの代わりに、次のことを試してください。

#include <string.h>

少なくともstrcpy (2)のマニュアルページによれば、ここでstrcpystrncpyが定義されます。

ただし、 exit関数はstdlib.hで定義されているため、そこで何が起こっているのかわかりません。

Brandon picture
2011年06月22日
16

一部のプログラムの場合、これらのエラーは正常であり、修正する必要はありません。

たとえば、プログラムphrapをコンパイルすると、これらのエラーメッセージが表示されます。 このプログラムには、いくつかの組み込み関数を変更または置換するコードが含まれています。警告を修正するために適切なヘッダーファイルをインクルードすると、GCCは代わりに一連のエラーを生成します。 したがって、警告を修正すると、ビルドが効果的に中断されます。

正常にコンパイルされるはずのディストリビューションの一部としてソースを取得した場合、エラーは正常である可能性があります。

Eric Leschinski picture
2014年03月17日
10

上記のエラーを生成するCコードを次に示します。

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

gccを使用してFedora17 Linux64ビットで次のようにコンパイルします。

[email protected] ~/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]
[email protected] ~/foo2 $ ./n 
[email protected] ~/foo2 $ 

警告を消すには、次の宣言をファイルの先頭に追加します。

#include <stdlib.h>
ajlittoz picture
2014年03月29日
7

mempcpy関数でこれらの警告に遭遇しました。 マニュアルページには、この関数はGNU拡張機能であり、概要は次のように示されています。

#define _GNU_SOURCE
#include <string.h>

#include前に#defineがソースに追加されると、GNU拡張機能の宣言が表示され、警告が消えます。