C 編譯小結

2021-09-22 02:07:29 字數 2428 閱讀 1945

一 靜態鏈結庫和動態鏈結庫的區別

1 動態鏈結庫有利於程序間資源共享

c語言的標準庫是動態鏈結庫,也就是說系統所有執行的程式共享著同乙個c語言標準庫的**段。而靜態庫則不同,如果系統中多個程式都要呼叫靜態庫中的函式,則每個程式都要將這個庫函式拷貝到自己的**段中,這顯然將占有更大的記憶體資源。

2 動態庫使得一些程式公升級簡單。

用靜態庫,如果庫發生變化,使用庫的程式要重新編譯,使用動態庫,只要動態庫提供給該程式的介面沒有變化,只要用重新生成的動態庫替換原來的就可以了。

3 對於動態庫,可以真正做到鏈結載入完全由程式設計師在程式中控制。

程式設計師可以在編寫程式的時候,可以明確的指明在什麼時候在什麼情況下,鏈結載入哪個動態鏈結庫函式。

4 由於靜態庫在編譯的時候,就將庫函式載入到程式中去,而動態庫函式必須在執行的時候才被載入,所以程式在執行的時候,用靜態庫速度更快些。

二 g++與gcc的區別

1 誤區1與正解1

誤區:gcc只能編譯c**,g++只能編譯c++**。

正解:gcc和g++都能編譯c**和c++**。但編譯時由所區別。

1.1 字尾為.c時,gcc把它當成c程式,而g++把它當前c++程式,字尾為.cpp時,兩者都認為是c++程式。注意,雖然c++是c的超集,但是兩者對語法的要求是有區別的,c++的語法規則會更加嚴謹。

1.2 編譯階段,g++會呼叫gcc,對於c++,兩者是等價的;但是因為gcc命令不能自動和c++程式使用的庫鏈結,所以通常用g++來完成鏈結,為了統一起見,乾脆編譯和鏈結統統用g++了,這就給人一種錯覺,好像cpp程式只能用g++。

2 誤區2與正解2

誤區:gcc不會定義__cplusplus巨集,而g++會

正解:這個巨集只是標誌著編譯器會把**按c還是c++語法來解釋,如果字尾為.c,並且採用gcc編譯器,則該巨集就是未定義的,否則就是已定義的。

3 誤區3與正解3

正解:編譯可以用gcc/g++,而鏈結可以用g++或gcc -lstdc++。因為gcc命令不能自動和c++程式使用的庫鏈結,所以通常用g++來完成鏈結。但在編譯階段,g++會自動呼叫gcc,二者等價。

4 誤區4與正解

誤區:extern "c"與gcc/g++有關係

正解:實際並沒有關係,無論是gcc還是g++,用extern "c",都是以c的命名方式為symbol命令,否則,都以c++方式命名。

三 實戰

1 me.h

extern "c" void cppprintf (void);
2 me.cpp

#include#include"me.h"

using namespace std;

void cppprintf(void)

4 g++編譯和檢視

[root@localhost 0402]# g++ -s me.cpp

[root@localhost 0402]# cat me.s

......

.globl cppprintf

.type cppprintf, @function

5 gcc編譯和檢視

[root@localhost 0402]# gcc -s me.cpp

[root@localhost 0402]# cat me.s

......

.globl cppprintf

.type cppprintf, @function

從而得出結論,加了extern "c"後,cppprintf這個函式用g++和gcc編譯得到的函式命名是一樣的,都是已c的命名方式命令。

6 將me.h的extern "c"去掉,用g++編譯

[root@localhost 0402]# g++ -s me.cpp

[root@localhost 0402]# cat me.s

......

.globl _z9cppprintfv

.type _z9cppprintfv, @function

7 將me.h的extern "c"去掉,用gcc編譯

[root@localhost 0402]# gcc -s me.cpp

[root@localhost 0402]# cat me.s

......

.globl _z9cppprintfv

.type _z9cppprintfv, @function

從而得出結論,去掉extern "c"後,cppprintf這個函式用g++和gcc編譯得到的函式命名是一樣的,都是已c++的命名方式命令。可見extern "c"與採用gcc/g++並無關係。

FlightGear編譯小結

養成寫blog的習慣,把平時遇到的一些有價值的事情記錄下來,這並不是每個人都能做到的。由於推免沒能推到自己第一想要的方向,退而求其次,我就來到嵌入式方向,並且畢業設計也在這邊的實驗室做,安排的任務跟計算機圖形有關係,更具體一點跟飛行模擬器 flight simulator 有關係,這樣就接觸了fli...

條件編譯小結

源文 編碼的時候經常要用到條件編譯,每次都到網上去查比較浪費時間,今天總結一下以備後用 visual c ifdef msc ver 非vc編譯器很多地方也有定義 borland c ifdef borlandc unix windows windows 95 98 me的ver win32 win...

條件編譯小結

編碼的時候經常要用到條件編譯,每次都到網上去查比較浪費時間,今天總結一下以備後用 visual c ifdef msc ver 非vc編譯器很多地方也有定義 borland c ifdef borlandc unix windows windows 95 98 me的ver win32 window...