2013-08-23 58 views
1

我想創建我的第一個makefile。我使用以下命令測試了我的程序:我的makefile中缺少什麼?

Command 1: gcc -Wall -ggdb3 -std=c99 -o file1 file1.c -lm -lpthread -l 
Command 2: gcc -Wall -ggdb3 -std=c99 -o file2 file2.c -lm -lpthread 

一切正常。然後我創建了一個makefile(請參見下文)。我不斷收到錯誤消息。有人可以看看我的代碼,並告訴我有什麼問題嗎?

file2.o: In function `seed_primes': 
file2.c:(.text+0x461): undefined reference to `sqrt' 
file2.c:(.text+0x466): undefined reference to `sqrt' 
file2:(.text+0x533): undefined reference to `sqrt' 
file2.o: In function `create_threads': 
file2.c:(.text+0x668): undefined reference to `pthread_create' 
file2.c:(.text+0x6b5): undefined reference to `pthread_join' 
file2.o: In function `next_seed': 
file2.c:(.text+0x860): undefined reference to `sqrt' 
collect2: ld returned 1 exit status 
make: *** [file2] Error 1 

這裏是我的makefile:

CC=gcc 
DEBUG=-ggdb3 
CFLAGS=#(DEBUG) -Wall -lm -lpthread -lrt -l 

PROGS=file1 file2 

all: $(PROGS) 

file1: file1.o 
    $(CC) $(CFLAGS) -o file1 file1.o 

file1.o: file1.c 
    $(CC) $(CFLAGS) -c file1.c  

file2: file2.o 
    $(CC) $(CFLAGS) -o file2 file2.o 

file2.o: file2.c 
    $(CC) $(CFLAGS) -c file2.c 

clean: 
    rm -f $(PROGS) *.o *~ 
+1

'-l'選項本身對你的作用是什麼? –

回答

7

你已經設置CFLAGS來,因爲#註釋字符的空字符串(你可能打算使用改爲$)。

您不應將庫設置爲CFLAGS;他們屬於LDLIBS

您不需要file1:規則,file2:規則或對象文件規則。

CC  = gcc 
DEBUG = -ggdb3 
CFLAGS = $(DEBUG) -Wall 
LDLIBS = -lm -lpthread -lrt -l 

PROGS = file1 file2 

all: $(PROGS) 

clean: 
    rm -f $(PROGS) *.o *~ 

注:LDLIBS和相關LDFLAGS不能跨的make變種100%一致。 LDFLAGS應該用於庫路徑; LDLIBS用於圖書館名稱(-lxyz等)。

如果兩個程序需要不同的庫,則需要創建單獨的構建規則(如原來那樣)或使用條件宏指派(GNU make)。

+0

非常感謝你的提示!我修復了我的makefile。它創建了2個可執行文件。但我得到了一個警告 - 「icc:命令行警告#10155:忽略選項'-l';需要參數」。有什麼我需要補充嗎? (注意:我將gcc改爲icc,以便在我學校的服務器上進行編譯)。 – user2203774

+0

糟糕,在我從makefile中刪除「-l」後,警告消失。我運行可執行文件...一切似乎都很好。我之前使用過-l,因爲當我在終端中運行它時,我不斷收到某種警告,並在添加-l – user2203774

+0

後消失,我在問題的評論中詢問了簡單的'-l';我只是放棄它,看看是否有效;它可能會。 '-l'標誌後面通常是一個庫'name'(所以'-lm'或'-l m');在沒有任何參數的情況下,它會要求鏈接器鏈接一個沒有名稱的庫,或者類似的東西......因此來自'icc'的警告。所以,從'LDLIBS'中刪除'-l'。 –

1

你把你所有的旗幟在CFLAGS這使得它們之前出現在命令行中的目標文件。注意你的測試命令沒有這樣做。

更改國旗:

CFLAGS=$(DEBUG) -Wall 
LDFLAGS=-lm -lpthread -lrt 

然後在食譜:

$(CC) $(CFLAGS) -o file1 file1.o $(LDFLAGS)