g++編譯和鏈接

預處理指令

g++ -E main.cpp -o main.i    

編譯成彙編指令

g++ -S main.i -o main.s

靜態鏈接 (後綴爲.a )

假設有這些文件add.h,add.cpp,sub.h,sub.cpp

  • 由.o文件創建靜態庫可以使用命令
    g++ -c add.cpp sub.cpp           
    ar cr libmymath.a add.o sub.o
  • ar tv libmylib.a可以顯示庫文件中有哪些目標文件,顯示文件名,時間和大小信息
  • 在程序中使用靜態庫使用命令g++ -o main main.cpp -L. -lmymath

動態鏈接 (後綴名爲.so)

  • 創建動態鏈接庫可以使用
g++ -fPIC -o add.o -c add.cpp     
g++ -fPIC -o sub.o -c sub.cpp      
g++ -shared -o libmymath.so add.o sub.o         

也可以使用

g++ -fPIC -shared -o libmymath.so add.cpp sub.cpp

-fPIC表示編譯爲位置獨立的代碼,如果不用此選項的話,不能達到真正的代碼段共享的目的
-Lpath表示在path目錄中搜索庫文件,如-L.表示在當前目錄
-Ipath表示在path目錄中搜索頭文件

  • 在程序中使用動態庫
g++ -o main main.cpp -L. -lmymath

此時運行main程序會出錯,因爲程序運行時會在/usr/lib/lib中查找需要的動態庫文件

  • 動態庫的搜索路徑先後順序爲:

    • 編譯目標代碼時指定的動態庫搜索路徑
    • 環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑
    • 配置文件/etc/ld.so.conf中指定的動態庫搜索路徑,只需要在該文件後追加一行完整路徑如/root/test/lib即可,然後ldconfig使修改生效
    • 默認的動態庫搜索路徑/lib
    • 默認的動態庫搜索路徑/usr/lib
      1. 未解決上述問題,採取的步驟爲(採用其一即可):
    • 將文件libmymath.so複製到目錄/usr/lib
    • 修改環境變量LD_LIBRARY_PATH,具體命令爲
      export LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH
      sodu ldconfig
  • 靜態鏈接庫和動態鏈接庫的特點

    1. 動態鏈接庫有利於進程間資源共享。當某個進程需要調用某個動態鏈接庫的函數時,操作系統會查看所有正在運行的進程,看內存裏是夠有此庫函數的拷貝,如果有,則共享那一份拷貝,否則鏈接載入。而靜態鏈接庫不同,每個程序都需要將用到的庫函數拷貝到自己的代碼段
    2. 動態鏈接庫使得程序升級更容易,只要接口不變,新的動態鏈接庫直接可以使用
    3. 靜態鏈接是編譯時鏈接,而動態鏈接是運行時鏈接,所以靜態鏈接的程序執行速度更快
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章