国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux下gcc編譯,動態(tài)庫和靜態(tài)庫,makefile,gdb調試

這篇具有很好參考價值的文章主要介紹了Linux下gcc編譯,動態(tài)庫和靜態(tài)庫,makefile,gdb調試。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.編譯過程

1.1 預處理(Pre-Processing)

  展開頭文件, 宏替換(變量宏、函數(shù)宏)、替換空格等

gcc -E hello.c  -o hello.i     // -E 預處理選項, -o 重命名

Linux下gcc編譯,動態(tài)庫和靜態(tài)庫,makefile,gdb調試

1.2 編譯(Compilation)

  逐行檢查程序中出現(xiàn)的語法錯誤,簡單的邏輯錯誤

gcc -S hello.i -o hello.s

Linux下gcc編譯,動態(tài)庫和靜態(tài)庫,makefile,gdb調試

1.3 匯編(Assemble)

  將 .s 匯編文件中所有的匯編指令翻譯成二進制機器碼(下面就是來了個截圖,二進制顯示了亂碼)

gcc -c hello.s -o hello.o

Linux下gcc編譯,動態(tài)庫和靜態(tài)庫,makefile,gdb調試

1.4 鏈接(Linking)

  將 .o 的目標文件,鏈接庫文件、數(shù)據(jù)段合并,地址回填(把匯編里相對地址替換成程序運行后真正可以運行的地址)。生成可執(zhí)行文件 hello

gcc hello.o -o hello

1.5 gcc常用參數(shù)

-E // 展開頭文件
-s // 生成匯編文件
-c // 編譯生成2進制文件
-I // 指定頭文件路徑 大i
-L // 指定庫文件路徑
-l // 指定庫名 小L
-g // 包含調試信息 
-On // n取 0-3, n 越大優(yōu)化級別越高
-Wall //warning all 顯示所有警告
-D // 編譯時動態(tài)注入一個宏, 編譯的時候控制#define的具體數(shù)值

2.動態(tài)庫和靜態(tài)庫

2.1 函數(shù)庫

  本質:把具有相同功能的一組函數(shù)放到同一份文件中(源碼或二進制的形式)

2.2 靜態(tài)庫

  對執(zhí)行速度有要求

  • 機制:把引入的庫文件通過編譯直接復制到 .out 文件中
  • 優(yōu)點:將函數(shù)庫中的函數(shù)本地化,尋址方便,速度快(函數(shù)庫執(zhí)行效率 = 自定義函數(shù)的執(zhí)行效率)
  • 缺點:每個程序都需要復制一份,會浪費內存

  制作靜態(tài)庫:?

gcc -c add.c sub.c mul.c    // 制作 .o 文件
ar rs libmymath.a add.o sub.o mul.o    // 制作靜態(tài)庫
gcc hello.c -L ./ -lmymath -o app    // 指定頭文件路徑, 指定庫名, 設置文件輸出名app

2.3 動態(tài)庫

  對執(zhí)行速度不敏感,對系統(tǒng)資源敏感;更新比較頻繁(可以避免完全重新編譯)

  • 機制:代碼共享
  • 優(yōu)點:節(jié)省內存(共享)、易于更新(動態(tài)鏈接)
  • 缺點:相較于靜態(tài)庫函數(shù)調用速度慢,函數(shù)地址是延時綁定機制
gcc -c -fPIC add.c sub.c mul.c    // -fPIC生成與位置無關的目標文件
gcc -shared -o libmymath.so sub.o mul.o add.o    // 生成一個動態(tài)庫
gcc hello.c -o app -L ./lib -l mymath -I ./inc    // 生成文件

 啟動 ./app 報錯,錯誤原因:”動態(tài)鏈接器“ ld-linux-x86-64.so.2 搜索動態(tài)庫的路徑?jīng)]有指定

  鏈接器:工作于 gcc 編譯過程中的鏈接階段。工作結束后生成可執(zhí)行文件

  動態(tài)鏈接器:工作于可執(zhí)行程序運行之后,輔助加載器負責將動態(tài)庫加載到內存

 解決辦法

  環(huán)境變量法:export LD_LIBRARY_PATH=./lib 將當前動態(tài)庫所在的目錄加入到環(huán)境變量,終端退出后環(huán)境變量就會失效

  配置文件法:vi .bashrc 加入一行 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib,重啟終端,每次啟動終端自動生效

  拷貝法:把自己的動態(tài)庫直接拷貝到 /lib 或 /usr/lib 中

  緩存文件法(推薦):修改配置文件,修改緩存文件,生成動態(tài)鏈接器需要搜索的新目錄位置

sudo vim /etc/ld.so.conf    // 修改動態(tài)鏈接庫的路徑
// 將絕對路徑增加到文件中
sudo ldconfig -v    // 更新 ld.so.cache 該文件影響動態(tài)鏈接庫搜索的位置

3.makefile

3.1 語法

 目標:依賴條件

 tab縮進,指令

hello:hello.o add.o sub.o mul.o
    gcc hello.o add.o sub.o mul.o -o hello
hello.o:hello.c
    gcc -c hello.c -o hello.o
sub.o:sub.c
    gcc -c sub.c -o sub.o
add.o:add.c
    gcc -c add.c -o add.o
mul.o:mul.c
    gcc -c mul.c -o mul.o

 模式規(guī)則:在makefile中,具有有嚴格統(tǒng)一的規(guī)則,使用模式規(guī)則代替,模式規(guī)則中只能使用 $< 符號

%.o:%.c
    gcc -c $< -o $@

 靜態(tài)模式規(guī)則:將模式規(guī)則指定給某一個變量使用

$(obj):%.o:%.c
    gcc -c $< -o $@

 偽目標:針對殘缺的規(guī)則,使之生成目標(比如有一個clean.o文件已經(jīng)是最新的,就不會執(zhí)行clean清除命令

.PHONY:clean ALL

3.2 函數(shù)介紹

3.2.1 wildcard 函數(shù)

// 匹配當前工作目錄下的所有 .c 文件,將文件名組成列表,賦值給 src 變量
// src = add.c sub.c mul.c hello.o
src = $(wildcard ./*.c)

3.2.2 patsubst 函數(shù)

// 用來替換參數(shù), 將 參數(shù)3 中包含 參數(shù)1 的部分替換為 參數(shù)2
// obj = add.o sub.o mul.o hello.o
obj = $(patsubst %.c, %.o, $(src))

3.3 普通變量和自動變量

 普通變量

  • 定義變量語法:變量名 = 變量值? ? ?(foo = abc)
  • 取變量值語法:$(變量)? ? ? ? ? ?(bar = $abc ---> bar = abc)

 自動變量

  • $@: 在規(guī)則的命令中,表示規(guī)則中的目標
  • $^ : 在規(guī)則的命令中,表示所有依賴條件
  • $< : 在規(guī)則的命令中,表示第一個依賴條件。如果該變量應用在”模式規(guī)則“中,它可以將依賴條件列表中的每一個依賴,依次取出,套用模式規(guī)則

3.4 關鍵字

  ALL: 默認情況下第一組生成文件的目標就是終極目標,或者顯示的寫ALL:hello表示終極目標,完成后結束makefile

  clean: 借助makefile清除項目中的指定文件,例如(clean: -rm -rf $(obj) hello

  指令 make -n 模擬執(zhí)行命令,不真正執(zhí)行,可以先看一次避免出問題

3.5 修改后的 makefile

src = $(wildcard *.c)
obj = $(patsubst %.c, %.o, $(src))

CC = gcc
target = app

ALL:$(target)

$(target):$(obj)
    $(CC) $^ -o $@

$(obj):%.o %.c
    $(CC) -c $< -o $@

clean:
    -rm -rf $(obj) $(target)

.PHONY:clean ALL

4. gdb調試

4.1 基礎指令

 基礎的斷點設置和繼續(xù)運行等指令

  • -g:使用該指令編譯可執(zhí)行文件,否則沒有調試表
  • gdb ./a.out
  • list:list 1 列出源碼,根據(jù)源碼指定行號設置斷點,1表示從第一行開始顯示源碼
  • b:b 55 在第55行添加斷點
  • run/r:運行程序,啟動調試(可以直接找到停止位置就是出錯位置)
  • next/n:下一條指令(越過函數(shù))
  • step/s:下一條執(zhí)行(進入函數(shù)內部)
  • print/p:打印變量值,如p var 查看 var 變量的值
  • continue:執(zhí)行到下一個斷點
  • finish:結束當前函數(shù)調用
  • quit:退出調試
  • start:不使用斷點,直接開始單步調試

 設置一些條件和查看棧幀及變量文章來源地址http://www.zghlxwxcb.cn/news/detail-711064.html

  • set args:啟動gdb調試后,通過該指令可以設置main函數(shù)的參數(shù),需要在start和run指令之前設置
  • info b:查看當前斷點信息表
  • b 23 if i=5:設置斷點在23行,如果 i=5 時斷點才生效
  • ptybe:查看變量類型
  • display:設置跟蹤變量,display i,跟蹤變量 i
  • undisplay:取消跟蹤變量
  • bt:列出當前程序存活的棧幀
  • frame:如果有多層調用,在內層想查看外層棧幀里的參數(shù),使用 frame n (n 是棧幀編號)切換棧幀,再使用 p var 打印變量

到了這里,關于Linux下gcc編譯,動態(tài)庫和靜態(tài)庫,makefile,gdb調試的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【Linux】編譯器-gcc/g++與調試器-gdb的使用

    【Linux】編譯器-gcc/g++與調試器-gdb的使用

    ?? 樊梓慕: 個人主頁 ??? 個人專欄: 《C語言》《數(shù)據(jù)結構》《藍橋杯試題》《LeetCode刷題筆記》《實訓項目》《C++》《Linux》 ?? 每一個不曾起舞的日子,都是對生命的辜負 目錄 前言 1.gcc/g++語法 2.gcc的使用及編譯器是如何\\\"翻譯\\\"代碼的? (1)預處理 (2)編譯 (3)匯編

    2024年02月04日
    瀏覽(19)
  • 【linux】2 Linux編譯器-gcc/g++和Linux調試器-gdb

    【linux】2 Linux編譯器-gcc/g++和Linux調試器-gdb

    ヾ(????)?\\\" 人總要為過去的懶惰而付出代價 ヾ(????)?\\\" 程序(文本)——機器語言(二進制) 預處理 (進行宏替換) 編譯(生成匯編) 匯編(生成機器可識別代碼) 連接(生成可執(zhí)行文件或庫文件) 為什么計算機只認識二進制? 組成計算機的各種組件只認識二進制

    2024年02月11日
    瀏覽(24)
  • 【Linux】編譯器gcc和g++與調試器gdb的使用

    【Linux】編譯器gcc和g++與調試器gdb的使用

    我們知道,一個程序被運行起來之后需要經(jīng)歷四個階段然后才變成一個可執(zhí)行的程序,他們分別為:預處理,編譯,匯編和鏈接。下面我們將介紹這四個階段的操作,測試代碼如下: 1.1 預處理 預處理也叫預編譯,程序在預處理階段會完成如下操作: 展開頭文件,將頭文件中

    2024年02月07日
    瀏覽(29)
  • Linux下動態(tài)庫和靜態(tài)庫編譯實踐

    之前寫過JNI的文章,在JNI實踐過程中,也涉及到對動態(tài)庫/靜態(tài)庫的一些編譯實踐,這里統(tǒng)一記錄一下。 注意 :-fPIC編譯選項可使GCC生成位置無關代碼,簡單來說生成的代碼中的函數(shù)與全局變量均為相對地址,通過GOT (Global offset table)來確定其位置,這種方式引入了一層額外的

    2024年01月17日
    瀏覽(21)
  • aarch64-linux-gcc安裝編譯及生成so動態(tài)庫和調用

    aarch64-linux-gcc安裝編譯及生成so動態(tài)庫和調用

    官方二進制下載 Ubuntu packages 提供了軟件包: gcc-arm-linux-gnueabihf (4:7.4.0-1ubuntu2.3 以及其他的) 。 建議直接從 linaro 的官網(wǎng)下載相應版本的 gcc-linaro 交叉編譯工具,并直接選擇帶有二進制的文件,即在官網(wǎng)入口處選擇 binaries 路徑,該文件夾下面包含各種版本的已經(jīng)編譯好的 aarch

    2024年02月13日
    瀏覽(28)
  • 【Linux】Linux工具篇(yum、vim、gcc/g++、gdb、Makefile、git)

    【Linux】Linux工具篇(yum、vim、gcc/g++、gdb、Makefile、git)

    ?? 作者簡介:一名在后端領域學習,并渴望能夠學有所成的追夢人。 ?? 個人主頁:不 良 ?? 系列專欄:??Linux ? ??C++ ?? 學習格言:博觀而約取,厚積而薄發(fā) ?? 歡迎進來的小伙伴,如果小伙伴們在學習的過程中,發(fā)現(xiàn)有需要糾正的地方,煩請指正,希望能夠與諸君一

    2024年02月12日
    瀏覽(21)
  • Linux中的工具:yum,vim,gcc/g++,make/makefile,gdb

    Linux中的工具:yum,vim,gcc/g++,make/makefile,gdb

    目錄 1、yum 1.1 查看軟件包: ?1.2 安裝軟件包 1.3 卸載軟件 2、vim 2.1 vim的三種模式 2.2 vim的基本操作 2.3. vim正常模式命令集 2.3.1 插入模式 2.3.2 移動光標 2.3.3 刪除文字 2.3.4 復制 2.3.5 替換 2.3.6撤銷上一次操作 2.3.7 更改 2.3.8 跳至指定的行 2.4. vim末行模式命令集 3、gcc/g++ 3.1 預處理

    2024年02月10日
    瀏覽(24)
  • [Linux][環(huán)境配置][yum][vim][gcc/g++][gdb][makefile][git]詳細講解

    [Linux][環(huán)境配置][yum][vim][gcc/g++][gdb][makefile][git]詳細講解

    本篇文章以Centos為例 通過 yum list 命令可以羅列出當前一共有哪些軟件包,由于包的數(shù)目可能非常之多, 使用 grep 命令只篩選出我們關注的包 yum list | grep sl 注意事項: 軟件包名稱: 主版本號.次版本號.源程序發(fā)行號-軟件包的發(fā)行號.主機平臺.cpu架構 “x86_64” 后綴表示64位系統(tǒng)

    2024年04月13日
    瀏覽(45)
  • Linux基礎工具的使用(yum,vim,gcc,g++,gdb,make/makefile)【詳解】

    Linux基礎工具的使用(yum,vim,gcc,g++,gdb,make/makefile)【詳解】

    1.在Linux下安裝軟件, 一個通常的辦法是下載到程序的源代碼, 并進行編譯, 得到可執(zhí)行程序。 2.但是這樣太麻煩了, 于是有些人把一些常用的軟件提前編譯好, 做成軟件包(可以理解成windows上的安裝程序)放在一個服務器上, 通過包管理器可以很方便的獲取到這個編譯好的軟件包

    2024年01月17日
    瀏覽(47)
  • Linux中的開發(fā)工具(yum,vim,gcc/g++,gdb,Makefile,git)

    Linux中的開發(fā)工具(yum,vim,gcc/g++,gdb,Makefile,git)

    yum(Yellow dog Updater,Modified)是Linux下非常常用的一種 包管理器 。主要應用在Fedora,RedHat,Centos等發(fā)行版上。 和手機上的軟件商店類似,我們可以使用 yum 來下載各種我們想要的軟件包。使用 yum 時必須聯(lián)網(wǎng)。 yum 基于 RPM 包管理,能夠從指定的服務器自動下載 RPM 包并且安裝

    2024年02月08日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包