Linux系統中C和C++程序的編譯與鏈接


  在Windows操作系統中,如果我們想要開發C程序或者C++程序,我們通常都會在集成開發環境(IDE, integrated development envirnoments)上面進行工作,由於這些IDE大多都使用圖形用戶界面(GUI,graphic user interface),因此在IDE上由C和C++源代碼生成可執行文件是一件非常方便的事。

  雖然現在很多Linux發行版比如(Ubuntu)也支持安裝很多很方便的IDE,使用命令行進行編譯還是有很多好處的,尤其是當你需要編譯大批的源文件的時候命令行能為你節省很多時間。下面我們將介紹在Linux操作系統中用命令行以及makefile進行編譯鏈接的問題,我們選擇的C編譯器和C++編譯器分別是gcc和g++,在任何Linux的發行版中,這兩個編譯器都能很方便地獲取到。為了敘述上的方便,我們以C++程序為例,C程序的編譯和鏈接跟C++程序大體上是相同的。

  為了完成一個C++程序,首先我們需要用一個文檔編輯器來編輯我們的源代碼,這里我們用vim編輯器來做這件事。

  首先,在終端上鍵入vim cprogram.cpp ,這里要注意的是這個后綴名,雖然在Linux系統對后綴名並沒有嚴格的要求,但是如果要讓g++識別出這是一個C++源文件的話,后綴名必須是c,cc,cxx,cpp,c++這幾種。比如說如果我們想要g++去編譯一個.txt后綴的文件的話,它就會輸出異常的信息。

 

   進入vim之后,我們先鍵入 i 進入 insert 模式,然后再輸入如下的源代碼:

 

   然后再在終端上鍵入g++ cprogram.cpp -o cprogram。 這個命令的意思讓g++編譯源文件cprogram.cpp,然后將編譯的結果輸出到 crpogram 中,這樣cprogram就成為了一個可執行文件。為了驗證cprogram是一個可執行文件,我們只需要用 ls -l 命令輸出它的權限:

 

  為了執行cprogram,我們只需要在終端上鍵入 ./cprogram ,這是因為cprogram作為一個程序並不在 $PATH 變量保存的路徑里面,所以我們需要指明它所在的位置(注意到由於我們一直沒有離開當前工作的文件夾,所以我們用的是 ./ 相對路徑,如果通過 cd 切換了工作文件夾,我們需要指明 cprogram 的絕對路徑。

  我們可以看到cprogram輸出了我們期望的 Hello Linux。

   在一個典型的C++程序的生成過程中,源文件經過編譯之后並不是直接就生成了一個可執行文件。就像在我們上面的例子中,我們為了在屏幕上輸出 Hello Linux 我們調用了 std::cout 函數,但是問題是在我們的源文件中並沒有實現 cout 函數,那么這個關於 cout 函數的代碼是怎么添加到我們的最終的程序里面去的呢。這是因為在C++程序的生成過程中,編譯只是將我們的C++源代碼轉換成了機器語言,此時會在生成一個以 .o 為后綴名的文件(在我們上面的例子中,就是 cprogram.o),通常將它稱為目標代碼(object code),要將目標代碼轉換成可執行文件,我們還需要經過一個叫做鏈接的過程。

  比如說在我們上面的例子中,我們 #include<iostream> 頭文件並且使用了其中的 std::cout 函數,我們需要了解的是這個頭文件僅僅包含了我們下面需要使用的 std::cout 函數的聲明,並沒有包含它的實現,它的實現放在了 iostream 庫里面。在我們鏈接的過程中,編譯器就會到 iostream 庫里去尋找包含 std::cout 的目標文件。然后把這個目標文件跟我們的 cprogram.o 鏈接起來就形成了我們最終的可執行文件。  

  上面的討論啟發我們可以實現自己的一個鏈接過程。

  首先我們編輯一個我們自己的頭文件 print.h :

 

   然后再寫一個只包含頭文件中聲明的函數 print() 的源文件 cprogram2.cpp ,注意在它的源文件中也要 #include"print.h" 。為什么這里有引號而不用尖括號呢?因為當編譯器遇到用尖括號包含的頭文件時,只會到存放標准庫頭文件的文件夾里面去尋找這個頭文件。而如果遇到用引號包含的頭文件會先在當前文件夾尋找,然后再去標准庫頭文件的文件夾。而我們這里是把這個頭文件放在當前文件夾的,需要用引號把它括起來。編寫好的 cprogram2.cpp 如下面圖:

 

   然后再回到我們原來的 cprogram.cpp ,對它做一些改動:

 

   為了得到 cprogram.cpp 和 cprogram2.cpp 的目標文件,我們只需要鍵入命令 g++ -c cprogram.cpp cprogram2.cpp 即可(-c 是 gcc 程序的可選項,即 complie, 編譯),通過 ls 命令我們可以看到當前目錄下已經生成了 cprogram.o 和 cprogram2.o 兩個目標文件。然后輸入命令 g++ cprogram.o cprogram2.o -o cprogram 鏈接這兩個目標文件生成最后的可執行文件 cprogram 。  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM