2017-03-17 70 views
0

我有一個程序,它使用靜態或共享庫。現在,我要像做從一個代碼創建幾個項目在一個生成文件中

make static 

make shared 

編譯該項目在兩起案件。 我的Makefile看起來像

shared: main.o libresult.so 
     gcc -o shared main.o -L. -lresult -Wl,-rpath,. 

main.o: main.c 
     gcc -c main.c 

libresult.so: func.o 
     gcc -shared -o libresult.so func.o 

func.o: func.c 
     gcc -c -fPIC func.c 

static: main.o libresult.a 
     gcc -o static main.o -L. -lresult 

main.o: main.c 
     gcc -c main.c 

libresult.a: func.o 
     ar cr libresult.a func.o 

func.o: func.c 
     gcc -c func.c 

clean: 
     rm -f *.o *.a *.so static shared 

關當然,終端給出了一些警告。它運作良好,但我不認爲 是多美麗的:)。如何讓它變得更好?

+0

爲了提供一個替代方案,我認爲使用shell腳本提供的切換機制爲每個項目保留單獨的makefile文件更有意義。使用shell腳本作爲Make的前端提供了很大的權力,類似於'configure'腳本如何爲不同的體系結構設置額外的標誌,操作系統定義和包含等。您可以調用腳本作爲例如'./build a'和'./build b','./build clean'等。 – Zhro

回答

1

1)你有main.o規則的兩個副本:

main.o: main.c 
    gcc -c main.c 

刪除其中之一。

2)你有func.o規則的兩個版本:

func.o: func.c 
    gcc -c -fPIC func.c 

func.o: func.c 
    gcc -c func.c 

這是一個比較嚴重的問題。您放入共享庫(libresult.so)中的對象必須編譯爲-fPIC;您放入靜態庫中的對象(libresult.a可能-fPIC一起編譯,但是沒有理由這樣做,並且可能會阻止編譯器窗體執行一些優化。讓不知道你的意圖,所以最好是使具有不同名稱的對象有兩個版本:

func_so.o: func.c 
    gcc -c -fPIC func.c -o func_so.o 

func_a.o: func.c 
    gcc -c func.c -o func_a.o 

(不要忘了修改依賴這些對象的規則)

3)使用automatic variables來減少冗餘並使makefile更清潔。例如:

main.o: main.c 
    gcc -c $< -o [email protected] 

一旦您對這些技術感到滿意,可以進行進一步的改進。

相關問題