【轉】關於編譯連接——gcc/g++

添加運行時共享庫目錄


運行使用共享庫的程序須要加載共享庫(不一樣於G++ 編譯時指定的連接庫),添加共享庫的步驟:c++

  1. 修改文件 /etc/ld.so.conf 添加共享庫目錄bash

  2. 運行 ldconfig 同步更新一下優化

如:this

$ gedit /etc/ld.so.conf
     #添加 /root/dreamlove/lib
$ ldconfig

添加include,lib的搜尋路徑


對全部用戶有效修改/etc/profile 
對我的有效則修改~/.bashrc 
#在PATH中找到可執行文件程序的路徑。
spa

export PATH =$PATH:$HOME/bin 

#gcc找到頭文件的路徑.net

C_INCLUDE_PATH=/usr/include/libxml2:/MyLib export C_INCLUDE_PATH 

#g++找到頭文件的路徑 prototype

CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/libxml2:/MyLib export CPLUS_INCLUDE_PATH 

#找到動態連接庫的路徑 調試

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/MyLib export LD_LIBRARY_PATH 

#找到靜態庫的路徑 code

LIBRARY_PATH=$LIBRARY_PATH:/MyLib export LIBRARY_PATH

使用source,加載這些定義使其當即生效;或者重啓xml

g++編譯時的流程


  • 調用預編器CPP進行預處理,生成.i文件
  • 調用編譯器egcs進行彙編,生成.s文件
  • 調用匯編器as生成目標,.o文件
  • 調用鏈接器ld進行連接,生成可執行文

g++使用注意項


用於連接庫的 -l 選項必須放在 g++ 選項後面,如:

$ g++ -o ./tmpExec/pthread pthread.cpp -lpthread
    #這個是正確的
$ g++ -lpthread -o ./tmpExec/pthread pthead.cpp #出錯

應該注意的選項


MM選項與M選項

生成文件的依賴關係,好比:g++ -MM testMM.cpp;將依賴關係輸出到屏幕上,此時應該對其進行重定向;-MM是不會進行語法檢查的。只是對源文件的include關係進行分析獲得依賴關係;如

#include <unistd.h>
#include "geteth0Ip.h"

int mian(){
    return;
}
//這個漏洞百出的源文件仍然可使用-MM得到它的依賴關係

與 makefile 的使用:

$(dfiles):%.d:%.cpp
    @g++   -MM  $< | sed  '$ a\\tg++ -c -o $(ObjsDir)/$(patsubst %.d,%.o,$@) $<' >$(DsDir)/$@
    # 使得每個 .d 文件都包含着一個完整的規則

經常使用選項

選項 參數 描述 例子
-x 'c|c++|..|' 再也不根據源文件的後綴名來判斷編寫源文件的語言,即指定源文件的語言 g++ -x 'c++' test.txt
-E   只執行編譯的第一個流程:預處理,不會生成文件,能夠重定向到文件 g++ -E test.cpp
-S   執行編譯的前兩個流程生成彙編代碼 g++ -S test.cpp
-c   執行前三個流程生成目標文件 g++ -c test.cpp
-o 目標文件名 重命名目標文件名 g++ -S -o test.asm test.cpp
-pipe   使用管道來存儲文件,下一個流程從/tmp/文件夾中讀取上一個流程的結果,使用pipe後,上一個流程將結果保存在內存中,下一個流程直接從內存中讀取上一個流程的結果 g++ -pipe -o test.exe test.cpp
-ansi   關閉gun的特性,使代碼全面符合ansi要求,從而具備高移植性 g++ -ansi -o test.ext test.cpp
-fno-asm   -ansi的一部分:將asm,inline,typeof視爲普通標識符 g++ -fno-asm -o test.exe test.cpp
-fno-strict-prototype   再也不支持  
-fthis-is-variable   再也不支持  
-fcond-mismatch   容許條件表達式的第2,3個參數的類型不一致,現已默認開啓 默認開啓
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
  對char類型進行設置,決定將char類型設置成unsigned char(前兩個參數)或者signed char(後兩個參數)  
-imacros 包含宏的文件 至關於include,能夠直接使用參數文件裏的宏 g++ -imacros hello.mac hello.cpp
-Dmacro
-Dmacro=defn
macro爲參數 至關於#define macro g++ -DUNICODE -o test.exe hello.cpp
-Umacro macro爲參數 至關於#undef macro,不能取消在文本文件中定義的宏! g++ -UUNICODE -o test.exe hello.cpp
-undef   取消對任何非標準宏的定義 g++ -undef -o test.exe hello.cpp
-Idir dir就是參數 通常查找頭文件順序:-I指定的目錄->當前目錄->環境變量定義的目錄 g++ -I'C:/Users/Dream/Desktop/' -o test.exe hello.cpp
-nostdinc   使編譯器不在系統缺省的頭文件目錄裏面找頭文件 g++ -nostdinc -o test.exe -c hello.cpp
-C   在預處理的時候,不刪除註釋信息,通常和-E使用,有時候分析程序,用這個很方便的 g++ -E -C -o test.h hello.cpp
-M   生成文件關聯的信息。包含目標文件所依賴的全部源文件,這個在製做makefile應該會頗有用 g++ -M -o test1.h hello.cpp
-MM   同-M,不過忽略#include<file>>形成的依賴關係 g++ -MM -o test.h hello.cpp
-Wa options 傳遞參數給as(彙編器)  
-Wl options 傳遞參數爲ld(鏈接器)  
-llibs lib就是參數 指定編譯的時候所使用的庫,liblibs.so(若是static選項設置的話就是liblibs.a) g++ -lprint hello.cpp(連接 libprint.so)
-Ldir dir就是參數 指定查找連接庫時的目錄 g++ -L'C:/Users/Dream/Desktop/' -lprint hello.cpp
-On n爲參數,表示優化等級取:0,1,2,3 進行相應程度的優化 g++ -O3 -o test3.asm -S hello.cpp
-g
-ggdb
-gstabs
-gstabe+
  生成調試信息,能夠被gdb使用
儘量地生成gdb格式的調試信息
生成stabs格式的調試信息
同時shengc stabs,gdb格式的信息
g++ -g hello.cpp
相關文章
相關標籤/搜索