1. 程式人生 > >Linux中編譯C文件

Linux中編譯C文件

-s nbsp 最簡 通過 gcc 基本 linu 16px sub

C/C++程序編譯的過程

預處理,展開頭文件,宏定義,條件編譯處理等。通過gcc -E source.c -o source.i或者cpp source.c生成。

編譯。這裏是一個狹義的編譯意義,指的是將預處理後的文件翻譯成匯編代碼的過程。通過gcc -S source.i生成。默認生成source.s文件。

匯編。匯編即將上一步生成的匯編代碼翻譯成對應的二進制機器碼的過程。通過gcc -c source.s來生成source.o文件。

鏈接。鏈接是將生成目標文件和其引用的各種符號等生成一個完整的可執行程序的過程。鏈接的時候會進行虛擬內存的重定向操作。

上面四個步驟就是C/C++程序編譯的幾個基本步驟。前面三個步驟都是很簡單,大多時候會合並為一個步驟。只有第四個步驟鏈接是復雜一點的。

C/C++程序編譯方式及生成指定文件

.o文件,即目標文件。一般通過.c或者.cpp文件編譯而來,相當於VC編譯出來的obj文件。

.a文件,archive 歸檔包,即靜態庫。其實質是多個.o文件打包的結果,相當於VC下的.lib文件。

.so文件,shared object 共享庫(對象),相當於windows下的dll。

(1) 編譯單個文件

$gcc file.c            #這是最簡單形式,缺省輸出為a.out
$./a.out               #執行
$gcc file.c -o file.o  #生成指定的可執行文件
$./file.o              #
執行

(2) 編寫及使用靜態庫(背景:main.c使用了sub.c中的函數,sub.c -> sub.o -> libsub.a)

$gcc -c sub.c                    #-c:只編譯不鏈接
$ar -rsv libsub.a sub.o          #鏈接靜態庫
$gcc main.c -L./ -lsub -o main.o #main.c:主函數 -L:庫文件路徑 -l:後面接庫文件名,全名為libsub.a
$./main.o                        #執行

(3) 編寫及使用動態庫(背景:main.c使用了sub.c中的函數,sub.c -> libsub.so)

$gcc -fpic -shared -o libsub.so sub.c #-shared:指定生成動態連接庫 -fpic:編譯為位置獨立的代碼
$gcc main.c -o main.o ./libsub.so
$./main.o                             #執行

Linux中編譯C文件