警告:組み込み関数 '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>

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

exit関数はで定義されているSTDLIB.H私はそこに何が起こっているのか分からないので、しかし、。


おかげで、私は約20の.cファイルをクリーンアップし、いくつかのヘッダーを追加できませんでした。
Alex Reynolds、

Cプログラムをコンパイルして仮想化タイプ(Xen HVM / KVM / VMware / Bare Metal)をチェックしようとしたときの問題を解決しました。ありがとう。
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の追加についてはすでに述べました。しかし、これは出口にとって十分なだけで、文字列関数にとっては十分ではありません。
Matt Fletcher

7

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

#define _GNU_SOURCE
#include <string.h>

ときに#define前に私のソースに追加され#include、GNU拡張のための宣言が見えるようになると警告が消えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.