Linux中C程序調試、makefile


gcc基本語法格式:gcc [-選項] 源文件 [-選項] 目標文件,GCC編譯C程序的過程:

  1. 預處理:gcc -E hello.c hello.i。-E指定執行預處理結束,下面類似。
  2. 編譯:gcc -S hello.i -o hello.S。
  3. 匯編:gcc -c hello.S -o hello.o。
  4. 鏈接:gcc hello.o -o hello。鏈接階段就需要涉及到函數庫了,舉例說明:要執行printf函數,我們都會#include <stdio.h>,但是預處理只能包含進stdio.h文件,也就是只有printf函數的聲明,而函數實現在函數庫libc.so.6中,雖然沒有特別指定這個庫,但是只要頭文件中有聲明,gcc會到系統默認搜索路徑"/usr/lib"下查找並鏈接函數庫,這樣才能執行printf函數。

函數庫有靜態庫和動態庫兩種,簡單來說,由.h和.c文件來生成函數庫,編譯后,就可以在其他.c文件中使用函數:

靜態庫的創建和使用:

  1. 將.h和.c文件匯編成目標文件:gcc -c libhello.c -o libhello.o。
  2. 將目標文件歸檔,封裝成庫:ar -rc libhello.a libhello.o。
  3. 在編譯過程中使用靜態庫:gcc usehello.c -o usehello_static libhello.a。然后就可以執行程序了。

動態庫的創建和使用:

  1. 匯編生成目標文件,和靜態庫一樣:gcc -c libhello.c。
  2. 編譯生成動態庫:gcc libhello.o -shared -W1,-soname,libhello.so -o libhello.so。
  3. 編譯程序和動態庫:gcc usehello.c -o usehello_dy -lhello -L ./ 。
  4. 執行時,也需要指明動態庫:LD_LIBRARY_PATH=$(pwd) ./usehello_dy 。

當然還可以統一函數庫版本的使用:

gcc -c libhello.c
gcc libhello.o -shared -W1,-soname,libhello.so -o libhello.so.1.0    //即生成庫可能就會有多個版本
ln -s libhello.so.1.0 libhello.so    //所以用一個軟鏈接來更新版本,對外卻統一顯示
gcc usehello.c -o usehello_dy -lhello -L ./
LD_LIBRARY_PATH=$(pwd) ./usehello_dy

如果在運行動態庫時,不想指明庫的路徑,則有兩種方法:

  1. 在/usr/lib或者/lib目錄下,存放動態庫或其鏈接。
  2. 在etc/ld.so.conf文件中,追加庫或者鏈接所在的路徑;然后退出保存,執行ldconfig命令使更改生效。

 

工程管理器make:

語法:系統默認自動變量:

$<第一個依賴文件、$@目標文件。

用戶自定義變量:變量=值——引用$(變量)。

將靜態庫用makefile完成,用make管理:

usehello_static: usehello.c libhello.a
    gcc $< -o $@ libhello.a
libhello.a: libhello.o
    ar -rc $@ $<
libhello.o: libhello.c
    gcc -c $<
clean: 
    rm usehello_static libhello.a libhello.o

動態庫:

usehello_dy: usehello.c libhello.so
    gcc $< -o $@ libhello.so -L ./
libhello.so: libhello.o
    gcc $< -shared -W1,-soname,libhello.so -o $@
libhello.o: libhello.c
    gcc -c $<
clean: 
    rm usehello_dy libhello.so libhello.o

在makefile里面寫lhello,它不認。


免責聲明!

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



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