g++

gcc / g++分別是gnu的c / c++編譯器, gcc/g++在執行編譯工作的時候,總共需要4步:

預處理 -> 生成 .i 文件
編譯 -> 匯編代碼 .s文件
匯編 -> 有匯編變為目標代碼 .o 文件
鏈接 -> 連接目標代碼,生成可執行程序

參數:

  • -E 只激活預處理(宏的替換和注釋的消除),這個不生成文件,你需要把它重定向到一個輸出文件里面.
g++ -E main.cpp > main.i 
  • -c 只做前三步, 不做鏈接, 生成 .o obj文件
g++ -c main.cpp
  • -S 只做前兩步, 生成 .s
g++ -S main.cpp
  • -o 生成鏈接文件
單個源文件: g++  -o exec main.c
多個源文件: g++ -o exec main.c print.c 
復雜依賴: 寫MakeFile文件 然后執行 make 命令
  • -g 只是編譯器,在編譯的時候,產生調試信息。

  • -ggdb
      此選項將盡可能的生成gdb的可以使用的調試信息.

  • -static
      此選項將禁止使用動態庫,所以,編譯出來的東西,一般都很大,也不需要什么動態連接庫,就可以運行

  • -fpic或-fPIC
    產生位置無關的目標代碼(因為是share),可用于構造共享函數庫。

g++ -fPIC -c print.c

print.o 可以用于被創建共享函數庫
  • -share
    windows中動態鏈接庫以.dll后綴為標記。動態鏈接庫和凈態鏈接庫不同,它里面的函數并不是執行程序的一部分,而是根據執行程序需要按需裝入,同時其執行代碼可在多個執行程序間共享,節省了空間,提高了效率,具備很高的靈活性,得到越來越多的青睞。

    在Linux中同樣有動態鏈接庫,它們以.so為后綴,即shared object,共享對象。在Linux下創建動態鏈接庫是件再簡單不過的事情,只要在變異函數庫員程序時加上-shared選項即可,這樣所生成的執行程序即為動態鏈接庫。從某種意義上說,動態鏈接庫也是一種執行程序。按一般規則,程序名應帶.so后綴。
    gcc -shared -o dest src
      此選項將盡量使用動態庫,所以生成文件比較小,但是需要系統由動態庫.
    共享函數庫與靜態函數庫

gcc -shared -o print.so print.o

gcc -o main_share -lprint -L. print.o
  • -include file
      包含某個代碼,簡單來說,就是便以某個文件,需要另一個文件的時候,就可以用它設定,功能就相當于在代碼中使用#include<filename>
  gcc hello.c -include /root/pianopan.h
  • -Ldir

    將dir目錄加到搜尋-l選項指定的函數庫文件的目錄列表中去,并優先于gcc缺省的搜索目錄。在有多個-L選項的情況下,按命令行上-L選項的前后順序搜索。dir可使用相對路徑。如-L../lib等。
    
  • -Idir
      在你是用#include"file"的時候,gcc/g++會先在當前目錄查找你所制定的頭文件,如果沒有找到,他回到缺省的頭文件目錄找,如果使用-I制定了目錄,他
      回先在你所制定的目錄查找,然后再按常規的順序去找.
      對于#include<file>,gcc/g++會到-I制定的目錄查找,查找不到,然后將到系統的缺省的頭文件目錄查找

  • -I-
      就是取消前一個參數的功能,所以一般在-Idir之后使用

  • -idirafter dir
      在-I的目錄里面查找失敗,講到這個目錄里面查找.


關于函數庫

(http://www.cnblogs.com/avril/archive/2010/05/16/1736524.html)

一個“程序函數庫”簡單說就是一個文件包含一些編譯好的代碼和數據,這些編譯好的代碼和數據可以在事后供其它的程序
使用。程序函數庫可以使整個程序更加模塊化,更容易重新編譯,而且更方便升級。

程序函數庫可分為三種類型:靜態函數庫--static libraries,共享函數庫--shared libraries,和動態函數庫--dynamic loaded libraries。靜態函數庫是在程序執行前就加入到目標程序中去了;而共享函數庫則是在程序啟動的時候加載到程序中,它可以被不同的程序共享;動態加載函數庫則可以在程序運行的任何時候動態加載。實際上,動態函數庫并非另外一種庫函數模式,區別是動態函數庫是如何被程序元使用的。

Linux系統上的函數庫分為兩種不同的類型:共享的和靜態的

  • 靜態函數庫

    每次當應用程序和靜態連接的函數庫一起編譯時,任何引用的庫函數中的代碼都會被直接包含進最終的二進制程序。

  • 共享函數庫
    包含每個庫函數的單一全局版本,它在所有應用程序之間共享。這一過程背后所涉及的機制相當復雜,但主要依靠的是現代計算機的虛擬內存能力,它允許包含庫函數的物理內存安全地在多個獨立用戶程序之間共享
如何創建共享函數庫:

未完

參考:
http://blog.sina.com.cn/s/blog_55a406730100rutb.html
http://www.cnblogs.com/shine-yr/p/5214875.html
http://www.cnblogs.com/avril/archive/2010/05/16/1736524.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容