2015-11-08 54 views
0

我有一個簡單的make文件,例如:簡單的makefile沒有產生輸出文件(正確)

all: 
    gcc -ansi -pedantic -Wall -Werror ListImplementation.c ListType.h ListInterface.h test.c -o test.out 

    gcc -ansi -pedantic -Wall -Werror ListImplementation.c ListType.h ListInterface.h sort.c -o sort.out 

其中test.c的是那些其他的C文件,headerfiles依賴的文件。 sort.c也是如此。

現在輸入「make」後編譯,但是在我的文本編輯器(gedit)中,sort.c由於某種原因被顏色編碼爲藍色。因此,當我查看目錄(在運行make後的Ubuntu上)時,test.out可以正常工作(它是綠色編碼的,但sort.out不會(它是白色的)。嘗試運行./sort.out不起作用該文件從來沒有變成一個輸出文件,儘管名稱的變化,有什麼可以去錯在這裏

+1

您不直接編譯標題;它們在包含在源文件中時被編譯。把它們從命令行中刪除。 (除了它是正確的)的一個優點是,線條的遠端可以看到沒有滾動。 –

+0

'make'語法的一部分是空格,確保在行首和'gcc'之間有TAB字符 – fghj

回答

0

簡潔地說,在makefile的整體結構是錯誤的,顯示的代碼,你應該使用類似:?

PROG1 = test 
PROG2 = sort 
PROGRAMS = ${PROG1} ${PROG2} 

LIST.c = ListImplementation.c 
TEST.c = test.c 
SORT.c = sort.c 

LIST.o = ${LIST.c:.c=.o} 
SORT.o = ${SORT.c:.c=.o} 
TEST.o = ${TEST.c:.c=.o} 

all: ${PROG1} ${PROG2} 

${PROG1}: ${LIST.o} ${TEST.o} 
    ${CC} -o [email protected] ${CFLAGS} ${LIST.o} ${TEST.o} ${LDFLAGS} ${LDLIBS} 

${PROG2}: ${LIST.o} ${SORT.o} 
    ${CC} -o [email protected] ${CFLAGS} ${LIST.o} ${SORT.o} ${LDFLAGS} ${LDLIBS} 

${LIST.o}: ListType.h ListInterface.h 
${SORT.o}: ListType.h ListInterface.h 
${TEST.o}: ListType.h ListInterface.h 

這將與make幾乎所有的版本。它假定make方案將在宏觀CC定義的C編譯器,它定義宏0123編譯標誌,宏LDFLAGS中的加載器標誌和LDLIBS中的庫。它假定make可以推斷出它可以使用內置的規則等同於創建sort.csort.o

sort.o: sort.c 
    ${CC} ${CFLAGS} -c -o [email protected] sort.c 

其中-o [email protected]可能不會在命令行上指定。

如果您使用的是GNU make,則有可用的未使用的可用短標。通常,我會爲程序的目標文件定義一個宏,然後使用依賴列表和鏈接器命令行中的宏。此外,與GNU make,可以有效地補充:

.PHONY: all 

告訴make,不應該被稱爲all各地實際的文件。

現在,當您運行make時,它看起來找到all。當它找不到它時,通過確保依賴關係,${PROG1}${PROG2}每個都是最新的,然後執行all目標的(空)命令列表。爲了使${PROG1},它找到規則,確保依賴關係是最新的,然後運行(非空)命令列表來創建目標。