いくつかのバイナリをコンパイルするとき、私はこれらの警告の数を得ています:
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
(2)のマニュアルページに従って、ここでstrncpy
とstrcpy
が定義されています。
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
関数でこれらの警告に出会いました。 manページには、この関数はGNUの拡張であると書かれています。
#define _GNU_SOURCE
#include <string.h>
#define
を#include
の前に私のソースに追加すると、GNU拡張子の宣言が見えるようになり警告は消えます。