C語言(GCC)如何編譯多個文件?
01-11
比如我有3個函數分別在3個文件里,我在第4個文件的main里要調用這3個函數我應該怎麼編譯?
@Watcher 杭州 說的沒有錯.這個是基本原理和形態.包括手寫Makefile,也算是用一個籃子把基本形態裝進裡面.比較適合於規模不大的項目.項目規模大了或者複雜了的話,Makefile是個非常復(bian)雜(tai)的問題...IDE也是個好辦法不過需要有桌面環境.但Linux嘛.桌面環境經常沒得用也是很正常的..
so..我來補充一個高(jian)級(dan)點的東西..automake家族.很多開源的項目都是用的這一套編譯的.基本上編譯安裝的步驟里,第一步是"./configurer"的基本都是這一套的.推薦這篇文章:
例解 autoconf 和 automake 生成 Makefile 文件總而言之就是一套工具.幫你依照你指定的規則去生成最終可運行文件.這樣一來基本就簡化成了寫一個Makefile.am=把要編譯的文件羅列出來就好啦.so easy!http://Makefile.amnoinst_PROGRAMS=outbin
outbin_CFLAGS=-std=c++11 // 輸入編譯要用的參數
outbin_LDFLAGS=-lmysqlclient // 輸入鏈接時要用的參數
outbin_SOURCES=
file1.c
file2.c
file3.c
簡單方法一直接編譯gcc file1.c file2.c file3.c main.c -o out
前提是main.c要include其他文件的頭文件,來避免main文件中沒有聲明就使用沒定義的函數導致的報錯,如果要寫的挫點,也可以不include頭文件,而在main文件裏手寫那幾個聲明。
方法二把3個文件編譯成動態共享庫,再編譯maingcc -shared -fPIC file1.c -o libfile1.sogcc -shared -fPIC file2.c -o libfile2.sogcc -shared -fPIC file3.c -o libfile3.sogcc main.c -L. -lfile1 -lfile2 -lfile3 -o out通過so產生的out,依賴so文件,好處是如果file2.c更新了那麼只需要替換新的libfile2.so,就可以直接運行原來的out獲得新功能,而不需要再次編譯出out替換。方法三靜態庫的方式gcc -c file1.c
gcc -c file2.c
gcc -c file3.c
ar -rc liballfiles.a file1.o file2.o file3.o
gcc main.c -L. -lallfiles -o out
大點項目手寫makefile,偷懶點靠ide直接搞定。看官方文檔能獲得更多東西
https://gcc.gnu.org/onlinedocs/gcc/Invoking-GCC.htmlLink Optionshttps://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html多文件就要解決依賴問題, 依賴問題推薦用make.
隨便編譯,只要把函數的聲明在main裡面包含就行(通過include頭文件或者自己extern declare)。這個和編譯順序(或者鏈接順序)沒任何關係。唯一有可能有關係的是這些函數都是同名且不是強類型,鏈接器會按照順序(抑或隨機)選一個。但這種應該不是你的情況。
推薦閱讀: