18.3.1.4
連線聯結器將多個二進位制的
object
檔案連線成為乙個可執行檔案,在程序中,它完成使用外部引用來替換程式中本地物件的引用。聯結器依據彙編器提供的符號表來完成這些工作。
此外,聯結器必須為程式中使用的
c標準庫的函式新增**,在連線的上下文中,乙個庫就是一系列
object
檔案的集合,為了便於處理,它們以歸檔檔案的形式被集合在乙個獨立的檔案中。
大多數標準函式庫通常在檔案
libc.a中(
其中字尾
.a代表「
archive」),
或者在乙個共享的動態連線庫
libc.so中(
其中字尾
.so代表「
shared object」)
。這些庫通常在
/lib/
或/usr/lib
中,或者在
gcc預設的其他庫目錄中存放。
特定的函式存放在各自己的庫檔案中,比如標準庫中的浮點數函式。為了示範如何連線這些庫,讓我們使用其他的變數來替代
circle.c中p
的定義,在
example 1-1
中,變數
pi使用乙個常量來初始化:
const double pi = 3.1415926536;// pi is a constant
我們可以使用反正切函式來替換,如下:
const double pi = 4.0 * atan(1.0);// because tan(pi/4) = 1
當然我們要在原始檔的頭部新增指示符
#include
,但函式
atan()
沒有在源**中定義,也不在
libc.a
中,編譯此
circle.c
檔案,我們要使用
-l選項來連線
math
庫。$ gcc -o circle -lm circle.c
math
庫的檔名為
libm.a
(在支援動態庫的系統
上,gcc
自動使用共享動態庫
libm.so
,如果它可用,可以檢視後面的「動態連線與共享
object
檔案」一節來獲取更多資訊),其中字首
lib和或綴
.a均為標準命名要求,當在命令列中基本名稱跟隨引數
-l時,
gcc自動擴充套件它們,例如m。
通常,gcc
在標準庫所在目錄中根據庫檔名稱來自動查詢,例如
/usr/lib
。有三種連線乙個庫的方式,其中之一是給
gcc提供全路徑和庫檔名,就像
object
檔案一樣,例如,假設庫檔名為
libmath.a,
存放在/usr/local/lib
中,如下的命令將使用
gcc編譯
circle.c
,然後聯結器將結果檔案
circle.o
與libmath.a
進行連線:
$ gcc -o circle circle.c /usr/local/lib/libmath.a
本例中,庫的名子必須放置在使用它的原始檔或
object
檔案之後,這是因為聯結器在命令中順序地使用這些檔案,並且不會返回到乙個前面的庫檔案來解決乙個後面物件中的引用。
第二種方不在
gcc預設路徑中連線的方式是使用
-l選項來新增另乙個庫的目錄來讓
gcc查詢:
$ gcc -o circle -l/usr/local/lib -lmath circle.c
你可以使用多個
-l選項來新增多個庫目錄,或者使用乙個
-l選項,後跟隨乙個目錄列表;第三種方式是確保你所引用庫的路徑在環境變數
library_path
中。你可以直接傳遞選項引數到連線階段,使用
-wl選項,後跟乙個使用逗號分隔的列表,如下:
$ gcc -lm -wl,-m circle.c circulararea.c > circle.map
命令列中的選項
-wl傳遞
-m給聯結器,指示聯結器在標準輸出上列印乙個連線和乙個記憶體印象檔案。
-wl後的列表必須以逗號開始,且不包含空格,如果不確定,你可認在同乙個
gcc命令列中使用多個
-wl選項,使用
-v選項來檢視聯結器的結果。
C核心技術手冊(二十八)
4.1.5.3 有符號整型轉換 整型型別轉換中超過目標型別取值範圍的問題,不僅存在在無符型別轉換中,也存在有符號型別轉換中,例如,當乙個值由型別 long 或unsigned int 轉換為int 結果為有符號整型並溢位,這與轉換為無符號整數不同,後者將會丟棄執行結果。絕大多數編譯會丟棄原來值二進位...
C核心技術手冊(二十八)
4.1.5.3 有符號整型轉換 整型型別轉換中超過目標型別取值範圍的問題,不僅存在在無符型別轉換中,也存在有符號型別轉換中,例如,當乙個值由型別long 或unsigned int 轉換為int 結果為有符號整型並溢位,這與轉換為無符號整數不同,後者將會丟棄執行結果。絕大多數編譯會丟棄原來值二進位制...
C核心技術手冊(二)
組成c 程式的 積木 叫做函式,每個函式都有自己的用途,並且可以相互呼叫。每個函式包含可被執行的語句,而這些語句可以分組,從而形成語句塊。做為程式設計師,你可以直接使用 c標準庫的的函式,也可以自己編寫函式來實現既定目的。除此之外,還有很多專用的庫可以使用,例如圖形函式庫。然而,使用這些非標準庫,會...