2012-03-02 79 views
1

我有以下的makefile,這是我以前使用過的其他makefile的輕微修改。雖然我的變量${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:

我改變.c.o.cpp.o。這是一個gnu猜測的例子,當我在我的一個規則中要求一個.o文件時,它應該只是運行g++ -c -o SeqPrep2.o SeqPrep2.cpp,即使我沒有告訴它這樣做?我想這是我的新問題,爲什麼上面的makefile可以工作,爲什麼它有我觀察到的奇怪行爲。有一點需要注意的是,儘管它在格式化過程中沒有出現,但g++-c之間有很大的空白,有點像試圖放入我的變量,但它沒有。這部分原因讓我相信它看到了我的統治,儘管現在看來並不是這樣。感謝您幫助我瞭解這些東西的工作原理。

+0

你有.co'但你編譯cpp文件規則',是不是這是一個問題,我是那種對那些朦朧規則。 – macduff 2012-03-02 17:54:05

回答

1

你有規則.c.o,但你正在編譯cpp文件,當我使用.cpp.o:它很好用!隨着文件: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默認情況下完成的事情,甚至沒有被定義? – 2012-03-02 18:07:13

+0

我認爲make有一個默認的.o.cpp:這樣,如果你不發表它,就會被調用。如果你想在行動中看到它,請'make -d',但要警告!輸出是** verbose **。 – macduff 2012-03-02 18:22:46