2011-04-09 125 views
1

我需要編譯一箇舊的應用程序,其tarball只包含* .c和* h,即。沒有Makefile。根目錄包含應用程序,而子目錄包含應用程序所需的庫。Makefile來編譯c/h?

我的Make/Makefile知識不是很好,我想知道編譯這個應用程序+庫最簡單的方法是什麼。

謝謝。


編輯:使用這個腳本...

# cat compile.bash 
#!/bin/bash 

cd mylib 
for cfile in *.c; do 
    ofile=$(echo "$cfile" | sed 's#.c$#.so#') 
    gcc -shared -c "$cfile" -o "$ofile" 
done 

cd .. 
gcc *.c -I mylib -L mylib -mylib -o myapp 

...我注意到,在每個MYLIB * .c文件編譯成* .so文件,而不是每個編譯成/目標文件和構建一個單一的.so文件,我會得到大量的警告和錯誤,例如。

unzip.c: In function âunzipâ: 
unzip.c:991: warning: format not a string literal and no format arguments 

gcc: unrecognized option '-mylib' 

file_util.c: In function âfile_moveâ: 
file_util.c:98: error: âerrnoâ undeclared (first use in this function) 

我不知道如何編譯庫,然後編譯應用程序沒有錯誤/警告。

+0

哎喲 - sed的對每個源文件的調用??如果你真的需要設置這個變量,可以嘗試'ofile = $ {cfile%.c} .so'這個應該做同樣的事情,而不是每次爲每個源文件啓動另一個進程。 – 2011-04-10 21:02:43

回答

1

無需使用for循環或生成中間對象文件:

(cd mylib && gcc -shared -fPIC -o libfoo.so *.c) && \ 
    gcc -Imylib -o app *.c mylib/libfoo.so 
+0

感謝您的命令。我得到了很多警告/錯誤,所以我假設我要麼丟失一些指向頭文件/庫或某些其他開關的指針(例如,ansi,std99等)www.pastebin.com/brPvXhdz – Gulbahar 2011-04-11 09:20:50

+0

問題解決:我是使用舊版本的工具鏈比我應該使用。此外,只使用CFLAGS = -Wall -02刪除警告。 – Gulbahar 2011-04-11 12:36:37

1

編譯庫:

cd libfoo 
for cfile in *.c; do 
    ofile=$(echo "$cfile" | sed 's#.c$#.so#') 
    gcc -shared -c "$cfile" -o "$ofile" 
done 

在這之後,你應該有一個libfoo.so文件libfoo的/。然後,編譯程序(不要忘了cd回):

gcc *.c -I libfoo -L libfoo -lfoo -o application 
0

最簡單的可能是得到一個IDE爲你做的構建。 Netbeans for one將創建一個Makefile,以便您可以獨立於IDE構建項目。