2016-11-09 4 views
-1

誤ったコンパイルとリンケージの結果、私のCソースファイルの1つが削除されることに気付きました。なぜこのコンパイルとリンケージが正しく行われないと、Cソースファイルが削除されますか?

ソースファイルが2つあり、ヘッダファイルがtest1.c,test2.cheader.hであるとします。私は誤ってコンパイルし、シェルコマンドcc -std=c99 -Wall -Werror -pedantic -o test1.c test2.cでこれらのファイルをリンクしようとします。

Undefined symbols for architecture x86_64: "_main", referenced from: implicit entry/start for main executable ld: symbol(s) not found for architecture x86_64

。これにより、誤ったコマンドに、私は、エラーメッセージが表示されます。

この後、ファイルtest1.cが削除されます。

私は削除の原因とその理由について興味がありますか?

ありがとうございます。

+1

'-o test1.c' '-o'オプションは出力をそのファイルに入れるようにコンパイラに指示します。あなたが[manual](https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html)を読んだら、自分で解決することができるもの – kaylum

+0

'-o'オプションに関するgccのドキュメント不明ですか? – Olaf

+0

@Olaf文書の中でこの削除の理由を説明していますか?私は '-o'が何をしているのか尋ねていませんでした。私はファイルを削除してエラーを表示するのではなく、ファイルを削除する理由を尋ねていました。 –

答えて

2

コマンドがtest1.cに出力されている場合、コマンドは失敗し、効果的にファイルが削除されます。

cc -std=c99 -Wall -Werror -pedantic -o output test1.c test2.c 
            ^the output flag 

プログラムを./outputに出力するようにコマンドを変更しました。 [原因コメントの更なるご質問には編集]


ccは、ファイルを削除する理由の質問:私はそれが何をしているのかについての詳細を調べるためにstrace -f cc -o test1.c test2.cを走ったが。 straceの出力の中でいくつかの点で、あなたは、この行を参照してください。

[pid XXXXX] unlink("test1.c")   = 0 

unlinkman 3 unlinkで続きを読む、ファイルを削除します。

ccがファイルを削除する理由は、ccはファイルの作成者だと考えているため、それ以降はクリーンアップしようとしています。

+0

それで、 'test1.c'に出力できない場合、ターゲットファイルを削除して終了しますか? –

+1

'cc ...中のある時点でプログラムは' open( "test1.c"、O_RDWR | O_CREAT | O_TRUNC、0666) 'モードで' test1.c'を開きます。それからファイルを削除する 'unlink(" test1.c ")'を実行します。 これを見たい場合は、次のコマンドを実行できます: 'strace -f cc -o test1.c test2.c&> output; grep "test1.c" output " - システムコールを表示します。あなたは 'man unlink'についてさらに読むことができます。私はCCがそれがファイルの作成者だと信じているので、それはそうすると思います。したがって、それ自身の後でクリーンアップしようとしています。 –

+1

これは私が探していたものです。ありがとうございました。 –

関連する問題