c 編譯連線庫

2022-05-13 15:52:27 字數 1196 閱讀 4070

學習from gcc/g++ 鏈結庫的編譯與鏈結

c++編譯分為四個階段

預編譯編譯

彙編鏈結

預編譯是c++編譯的最初部分,它的工作是在編譯之前對程式內容進行最有的取捨處理,使得一些語句參加編譯,而另一些語句不參加編譯。

常用的預編譯指令是:

1、包含指令:#include

2、條件指令:#if、#elif、#else、#endif、#ifdef、#ifndef

3、定義指令:#define、#undef

條件編譯指令的作用是直接取捨程式語句和協調多個標頭檔案

比如在公升級gcc版本時,同時需要滿足舊版本編譯,就可以使用條件編譯

#if defined(__gnuc__) && (__gnuc__ >= 3 )

//balabala

#else

//balabala other

定義指令可以用來防止同乙個檔案被include多次

這個階段對於c預處理後的檔案字尾是.i, c++處理後檔案字尾是.ii

from c++ 預編譯

編譯階段的主要工作通過詞法分析和語法分析將c++**翻譯成彙編**

這個階段會將.i檔案轉化為.s檔案

顧名思義彙編是將組合語言翻譯成機器指令

將.s檔案轉化為.o檔案

鏈結庫有兩種,分別是靜態鏈結庫和動態鏈結庫,各有優缺點。

靜態鏈結庫可以看做一組.o的集合

在鏈結階段會將彙編生成的.o檔案和引用到的庫鏈結打包到可執行檔案中

靜態庫對函式庫的鏈結是放在編譯階段完成的

優點:生成後的可執行檔案不依賴靜態鏈結庫.a,移植方便

缺點:浪費空間和資源,因為所有相關的目標檔案與牽涉到的函式庫被鏈結合成乙個可執行檔案。

編譯階段不會被鏈結到**中,在可執行檔案執行時才會被載入。

優點:1.多個應用程式需要呼叫相同的庫,記憶體中只需要有乙份該庫例項

2.可以實現程序中的資源共享(我理解是同乙個.so在不同的程序中使用的是不同的記憶體空間,但是可以在.so裡使用共享記憶體來實現資源共享,但是這也算不上動態鏈結庫的優點)

3.將一些程式公升級變得簡單(比如公升級動態鏈結庫**只需要重新編譯.so)

4.設定可以真正做到鏈結載入完全由程式設計師在程式**中控制(顯式呼叫)

缺點:生成後的可執行檔案依賴動態鏈結庫.so

centos 聯合編譯動態連線庫

windows上是dynamic linklibrary dll 字尾?dll unix或linux上是shared library 字尾是 so gcc o libme.so wso.c shared 將wso.c編譯成 libme.so 庫名為me lib so為字首跟字尾 gcc l root...

C 編譯連線總結(一) g

快速入門例子 g c a.cpp 編譯檔案,生成目標檔案 a.o g a.o o abc 連線 並重命名為可執行檔案 abc g c a.cpp o a 之後 g a 會儲存的,親驗 g a.cpp 編譯連線一起,生成a.out g a.cpp o hello 生成a.out並命名為hello 涉及...

c編譯生成so 庫

首先 gcc c fpic libst.c 生成 libst.o 然後gcc shared fpic o libst.so libst.o 生成 libst.so 動態鏈結庫 注意 fpic選項。pic指position independent code。共享庫要求有此選項,以便實現動態連線 dyn...