2017-08-04 16 views
1

ピントのインストール中にmakeを実行しなければなりませんでした。同じコンピュータ上で異なるコマンドを実行するMakefile

以下はMakefileです。

all: setitimer-helper squish-pty squish-unix 

CC = gcc 
CFLAGS = -Wall -W 
LDFLAGS = -lm 
setitimer-helper: setitimer-helper.o 
squish-pty: squish-pty.o 
squish-unix: squish-unix.o 

clean: 
    rm -f *.o setitimer-helper squish-pty squish-unix 

1台のコンピュータで正しく実行されました。両方makeコマンドの出力の最初の行を見た場合

gcc -Wall -W -c -o setitimer-helper.o setitimer-helper.c 
gcc -lm setitimer-helper.o -o setitimer-helper 
gcc -Wall -W -c -o squish-pty.o squish-pty.c 
gcc -lm squish-pty.o -o squish-pty 
gcc -Wall -W -c -o squish-unix.o squish-unix.c 
gcc -lm squish-unix.o -o squish-unix 

を(コマンドの出力は、以下に与えられる)が、他のコンピュータに私は次のエラー

gcc -lm setitimer-helper.o -o setitimer-helper 
setitimer-helper.o: In function `main': 
setitimer-helper.c:(.text+0xc9): undefined reference to `floor' 
collect2: error: ld returned 1 exit status 
<builtin>: recipe for target 'setitimer-helper' failed 
make: *** [setitimer-helper] Error 1 

を得

gcc -Wall -W -c -o setitimer-helper.o setitimer-helper.c 

および

gcc -lm setitimer-helper.o -o setitimer-helper 

彼らは異なっています。

なぜmakeが同じMakefileに対して異なるコマンドを実行しているのですか?エラーを取り除くにはどうすればよいですか?

+1

第2のコンピュータでは、ビルドされたバイナリが既に存在していたようです。作業ディレクトリは両方のコンピュータにマウントされた共有パーティションですか?あるいは、最初に 'make'して、バイナリを含むすべてを2番目のものにコピーしましたか? 2台のコンピュータは同じですか(同じハードウェアと同じソフトウェアがインストールされていますか? –

答えて

1

最初のコンピュータでは、setitimer-helper.oファイルが存在しないか、setitimer-helper.cファイルが新しいので、makeは再構築する必要があります。 2台目のコンピュータで

gcc -Wall -W -c -o setitimer-helper.o setitimer-helper.c 
gcc -lm setitimer-helper.o -o setitimer-helper 

setitimer-helper.oファイルが既に存在してsetitimer-helper.cファイルよりも新しいので、コンパイルコマンドが必要とされなかったと第二のコンピュータ:したがって、その後、リンク操作を行うコンパイラは、その後、実行します

gcc -lm setitimer-helper.o -o setitimer-helper 

実際の質問は、2番目のコンピュータでリンカエラーが発生した理由です。

その答えは、のオブジェクトファイルの後にフラグがリンカーラインに来る必要があるということです。これは、適切なものではないLDFLAGS変数に-lmを追加したためです。リンカーにファイルなどを探す場所を指定するオプションを含める必要があります(たとえば、-Lオプション)。

ライブラリはLDFLAGSではなくLDLIBS変数に追加する必要があります。これにあなたのメイクファイルを変更します。

all: setitimer-helper squish-pty squish-unix 

CC = gcc 
CFLAGS = -Wall -W 
LDLIBS = -lm 
setitimer-helper: setitimer-helper.o 
squish-pty: squish-pty.o 
squish-unix: squish-unix.o 

clean: 
     rm -f *.o setitimer-helper squish-pty squish-unix 

あなたのリンクラインが、その後のようになります。

gcc setitimer-helper.o -o setitimer-helper -lm 

し、適切に動作するはずです。

+0

いいですね。 'gcc -lm setitimer-helper.o -o setitimer-helper'がなぜ最初のコンピュータで動作したのかについての説明があった方が良いでしょう。 –

+0

少なくとも、提供された情報では説明できません。 – MadScientist

関連する問題