1,-c 編譯目標代碼
gcc -o hello.o -c hello.c //-o 只是指定生成目標文件名
或
gcc -c hello.c
都生成hello.o文件,不可以執行。
gcc -o hello hello.o
用目標文件生成hello可執行文件。
gcc -o hello hello.c
用源文件直接生成hello可執行程序。
2, -fpic或-fPIC 產生位置無關的目標代碼,可用於構造共享函數庫。
# gcc -fPIC -c message.c
“PIC”命令行標記告訴 GCC 產生的代碼不要包含對函數和變量具體內存位置的引用,這是因爲現在還無法知道
使用該消息代碼的應用程序會將它連接到哪一段內存地址空間。這樣編譯輸出的文 件 message.o 可以被用於建立
共享函數庫。
# gcc -shared -o libmessage.so message.o
將上面的mian.c使用共享庫函數ligmessage.so編譯:
# gcc -o goodbye -lmessage -L. message.o
3,gcc的常用連接選項有下列幾個:
-Ldir 將dir目錄加到搜尋-l選項指定的函數庫文件的目錄列表中去,並優先於gcc缺省的搜索目錄。在有多個-L
選項的情況下,按命令行上-L選項的前後順序搜索。dir可使用相對路徑。如-L../lib等。
-lname 在連接時使用函數庫libname.a,連接程序在-Ldir選項指定的目錄下和/lib,/usr/lib目錄下尋找該庫文件。在沒有使用-static選項時,如果發現共享函數庫libname.so,則使用libname.so進行動態連接。
-static 禁止與共享函數庫連接。
-shared 儘量與共享函數庫連接。
4,編譯選項順序
$ gcc test.o -L. -lhello -o test
注意: $gcc -L. -lhello test.o -o test 會出錯!。
原因是: -l是鏈接器選項,必須要放到被編譯文件的後面。 所以上面的命令中-lhello一定要放到 test.o的後面。