linux g++使用總結


本文學習總結一下linux環境下命令行編譯c++程序的內容,方便日后作為筆記來回顧。
安裝好linux發行版后,默認會安裝g++編譯器。

  • 單個源文件生成可執行程序
g++ helloworld.cpp
./a.out

編譯器默認的動作:編譯源代碼文件生成對象文件(object file),鏈接對象文件和 libstdc++ 庫中的函數得到可執行程序。然后刪除對象文件。由於命令行中未指定可執行程序的文件名,編譯器采用默認的 a.out。

g++ helloworld.cpp -o helloworld
./helloworld

更普遍的做法是通過 -o 選項指定可執行程序的文件名。
程序 g++ 是將 gcc 默認語言設為 C++ 的一個特殊的版本,鏈接時它自動使用 C++ 標准庫而不用 C 標准庫。

gcc helloworld.cpp -lstdc++ -o helloworld

選項 -l (ell) 通過添加前綴 lib 和后綴 .a 將跟隨它的名字變換為庫的名字 libstdc++.a。

  • 多個源文件生成可執行程序

如果多於一個的源碼文件在 g++ 命令中指定,它們都將被編譯並被鏈接成一個單一的可執行文件。

g++ *.cpp -o hello

如果cpp源文件較少,可以一一列出,如果很多,可以使用通配符*.cpp代替。
當然,也可以分別將cpp源文件先編譯成目標文件.o,再鏈接成最終可執行文件。

1 g++ -c hello.cpp -o hello.o 
2 g++ -c world.cpp -o world.o 
3 g++ hsello.o world.o -o helloworld

選項 -E 使 g++ 將源代碼用編譯預處理器處理后不再執行其他動作。
選項 -S 指示編譯器將程序編譯成匯編語言,輸出匯編語言代碼而后結束,生成的匯編語言依賴於編譯器的目標平台。
於是,完整的編譯過程:

1 g++ -E hello.cpp -o hello.i   // 預處理      
2 g++ -S hello.i  -o  hello.s   // 轉化為匯編文件
3 g++ -c hello.s -o hello.o     // 匯編文件->目標文件
4 g++ hello.o  -o  hello        // 鏈接
  • 創建靜態庫

靜態庫是編譯器生成的一系列對象文件的集合。鏈接一個程序時用庫中的對象文件還是目錄中的對象文件都是一樣的。庫中的成員包括普通函數,類定義,類的對象實例等等。靜態庫的另一個名字叫歸檔文件(archive),管理這種歸檔文件的工具叫 ar

1 g++ -c sayhello.cpp
2 g++ -c sayworld.cpp
3 ar -r libsay.a sayhello.o sayworld.o

程序 ar 配合參數 -r 創建一個新庫 libsay.a 並將命令行中列出的對象文件插入。
采用這種方法,如果庫不存在的話,參數 -r 將創建一個新的庫,而如果庫存在的話,將用新的模塊替換原來的模塊。
靜態庫使用:

g++ saymain.cpp libsay.a -o saymain
  • 創建動態庫

在靜態庫的基礎上,加上-fPIC -shared即可。

gcc -fPIC -shared -o libfunc.so *.cpp
  • include路徑和link路徑

-L(大寫L)
用到的函數或操作非標准庫下的,需要將庫存在的地址用-L包含,庫文件一般為.a或.so文件。
編譯程序按照-L指定的路進去尋找庫文件,一般的在-L的后面可以一次用-l指定多個庫文件。
-l(小寫L)
用在-L之后,后加庫名稱,-l庫名(.a文件名)
-I(大寫i)
包含include路徑,編譯程序按照-I指定的路進去搜索頭文件。
參考:https://www.cnblogs.com/zhangkele/p/10043207.html


免責聲明!

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



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