C語言(GCC)如何編譯多個文件?

比如我有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.am

noinst_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個文件編譯成動態共享庫,再編譯main

gcc -shared -fPIC file1.c -o libfile1.so

gcc -shared -fPIC file2.c -o libfile2.so

gcc -shared -fPIC file3.c -o libfile3.so

gcc 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.html

Link Options

https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html


多文件就要解決依賴問題, 依賴問題推薦用make.


隨便編譯,只要把函數的聲明在main裡面包含就行(通過include頭文件或者自己extern declare)。這個和編譯順序(或者鏈接順序)沒任何關係。唯一有可能有關係的是這些函數都是同名且不是強類型,鏈接器會按照順序(抑或隨機)選一個。但這種應該不是你的情況。


推薦閱讀:

C 語言用 gcc 和 vs2013 編譯有什麼區別?
如何評價《編譯系統透視:圖解編譯原理》一書?

TAG:編程 | Linux | C編程語言 | GCC |