2012-03-02 10 views
1

私は過去に使用した他のメイクファイルを少し変更しています。変数${CXXOPTS}.c.oメイクファイルルールで使用されていないのに、奇妙な問題があります。 makefileを実行すると、g++ -c -o SeqPrep2.o SeqPrep2.cppが実行されると実行されます。g++ -Iseqan-03-02-2012 -c -o SeqPrep2.o SeqPrep2.cpp。 (編集:私は問題を解決しますが、このメイクファイルが最初の場所ですべてで働いていた理由について以下の私の更新質問を参照)Makefile変数が無視されています

L=-lm -lz 
SEQANINC=seqan-03-02-2012 
DESTDIR=$(HOME)/ 
BINDIR=bin 
CXXOPTS=-I${SEQANINC} 
CXX=g++ 
A=SeqPrep2 
USEROPTS= 
O=$(patsubst %.cpp,%.o,$(wildcard *.cpp)) 
SOURCES=$(wildcard *.cpp) 

all: ${A} ${O} ${SOURCES} 

install: ${O} ${MYLIBS} ${SOURCES} 
    ${CXX} ${USEROPTS} -o ${DESTDIR}${BINDIR}/${A} ${O} ${L} 

${A}: ${O} ${MYLIBS} ${SOURCES} 
    ${CXX} ${USEROPTS} -o ${A} ${O} ${L} 

clean:: 
    rm -f ${A} ${O} 

.c.o: 
    ${CXX} ${CXXOPTS} ${USEROPTS} -c $< -o [email protected] 

check-syntax: 
    ${CXX} ${CXXOPTS} ${USEROPTS} -c -o .nul -S ${CHK_SOURCES} 

UPDATE:

私は.cpp.o.c.oを変更しました。これはgnuの推測で、私のルールの1つで.oファイルを尋ねたときに、それを実行するように言っていなくても、g++ -c -o SeqPrep2.o SeqPrep2.cppを実行するだけです。私は新しい質問だと思うのですが、なぜ上記のメイクファイルが全く機能しなかったのですか、なぜそれが私が観察した奇妙な振る舞いをしていたのですか? 1つ注意すべきことは、書式設定にもかかわらず、g++-cの間に空白がたくさんあります。私の変数を入れようとしていたようですが、そうではありませんでした。それは、たとえそれが今のようではないように見えても、私のルールを見ていたと私が信じるように元々部分的になっています。このような仕組みがどういうものなのか理解してくれてありがとう

+0

あなたはルール '.co'を持っていますが、CPPファイルをコンパイルしている、これは問題ではありません、私は一種のかすんそれらによルール – macduff

答えて

1

あなたはルール.c.oを持っていますが、私は.cpp.o:を使用するとcppファイルをコンパイルしています。 me.cpp us.cpp you.cpp

私が手::ファイルを

Building file me.cpp 
g++ -Iseqan-03-02-2012 -c me.cpp -o me.o 
Building file us.cpp 
g++ -Iseqan-03-02-2012 -c us.cpp -o us.o 
Building file you.cpp 
g++ -Iseqan-03-02-2012 -c you.cpp -o you.o 
g++ -o SeqPrep2 me.o us.o you.o -lm -lz 
+0

問題を解決してくれてありがとうございます。なぜ.c.oを使ったオリジナルがまったく効果があったのか知っていますか? g ++ -c whatever.cppを実行しています-o whatever.oは定義されていなくてもデフォルトで実行されますか? –

+0

私はmakeがデフォルトの.o.cppを持っていると思います。あなたがそれを省略すると呼び出されます。あなたがそれを実際に見たいと思ったら 'make -d'を実行してください、しかし警告を受けてください!出力は**冗長**です。 – macduff

関連する問題