一 靜態鏈結庫和動態鏈結庫的區別
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...