C核心技術手冊(三十八)

2022-03-10 17:52:56 字數 2252 閱讀 4213

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標準庫的的函式,也可以自己編寫函式來實現既定目的。除此之外,還有很多專用的庫可以使用,例如圖形函式庫。然而,使用這些非標準庫,會...