GUN開發環境基礎

2021-09-26 06:14:29 字數 4278 閱讀 7816

ide隱藏的細節在這裡得以顯示,為什麼交叉編譯後,就可以在不同的平台執行?而不同平台的執行,才真正的進入到嵌入式開發的大門。

gcc編譯過程引數:記憶用英文去記

-s:生成彙編檔案 assemble

-e:只預編譯 presses

-g:包含除錯資訊。gdb

-o file:指定目標輸出檔案 output

-l dir:搜尋標頭檔案路徑 include

.a[filename a]//靜態庫

.so[filename so+主版本號、次版本號、發行號]//動態庫

-static 靜態編譯

-shared  1、生成動態庫檔案2、進行動態編譯 預設的

-i dir  庫檔案搜尋中新增路徑

-fpic 生成使用相對位置無關的目標**(position indepedent code),用於static選項從pic目標檔案生成動態庫檔案

1、先生成目標檔案.o

2 ar crv[*.a][*.o]   #打包為 .a 的靜態鏈結庫檔案

gcc -o「file]「file.c] -l[file.a]如:gcc cxd.c -o cxd -l /root/desktop/hello.a               #呼叫自己的靜態鏈結庫

1、生成與位置無關的目標** gcc -fpic -c [*.c]

2、gcc -shared -o[*.so][*.o]

gcc -o[file][file.c] -l [file.so]

gcc -fpic -c hello.c                             #編譯成位置無關的 .o 檔案

gcc -shared hello.o -o hello.so             #生成動態鏈結庫

gcc cxd.c -o cxd -l /root/desktop/hello.so              #呼叫自己的動態鏈結庫

警告資訊:

-w:關閉所有警告

-wall:發出gcc所有有用的警告

-pedantic:發出ansi c 的所有的警告。形式化的,比較有用

優化選項:

-o[level]:優化等級,一般為0-3,只在發布時才用。

gdb除錯資訊設定:

在我們學習使用gdb除錯程式之前,我們先看看gdb有哪些命令。

命令    功能

r    run, 直接調到斷點處,沒有設定斷點的話直接執行程式

b fun    設定乙個斷點breakpoint在函式」fun」的最開始

b n    在當前執行原始檔的第n行設定斷點

b file.c:n    在當前原始檔file.c的第n行設定斷點

d n    刪掉delete第n行的斷點

info break    顯示所有斷點資訊

c    繼續(continue)執行程式,一直到下乙個斷點或程式結束

f    執行直到當前函式(function)結束

s    按step除錯1行,會進入函式體

s n    按step除錯接下來的n行

n    除錯1行,與按s命令不同的是此處不進入函式體

p var    輸出(print)變數」var」的值

set var=val    設定變數」var」的值

bt    列印呼叫堆疊(stack trace)

q    退出gdb

gdb使用說明

gdb有如下兩種使用方式 

1. 除錯會崩潰、有邏輯錯誤的程式 

2. 除錯程式崩潰時自動生成的coredump

下面說明如何gdb除錯

編譯並構建程式,加上除錯選項-g,e.g. gcc -g main.cpp -o test.out

用gdb來執行程式,gdb test.out

使用gdb命令來分析、除錯程式

退出gdb

make檔案:經過vi編輯,gcc編譯後,要想多個檔案的編輯或者叫project 或 make 在.net和deliphe裡面都叫make,然後才是安裝和發布,安裝包的製作過程;linux也是通過makefile檔案完後最後兩步。

make作用:

1、工程檔案組織,編譯成複雜的程式。

2、安裝及解除安裝我們的程式。

makefile編寫規則:

由若干規則所構成,每個規則又符合這樣的結構:targer(目標):prequisities(依賴)\n command(命令)。

用#來代表注釋

變數:1、使用者自定義變數:

makefile變數在宣告的時候需要對其進行賦值,而在使用該變數時需要在變數名前加上$符號,例如$(varname)。如果使用者需要在makefile檔案中使用$字元,則用$$來表示,這種應用多出現在對shell變數的使用上。

這種定義變數值的方法有乙個潛在的危險就是遞迴定義。例如:

a = $(b)

b = $(a)

make會檢測出這種錯誤

2、預定義變數

ar      歸檔維護程式的名稱,預設值為 ar。

arflags  歸檔維護程式的選項。

as      匯程式設計序的名稱,預設值為 as。

asflags  匯程式設計序的選項。

cc      c編譯器的名稱,預設值為 cc。

ccflags  c編譯器的選項。

cpp      c預編譯器的名稱,預設值為 $(cc) -e。

cppflags  c預編譯的選項。

cxx      c++編譯器的名稱,預設值為 g++。

cxxflags  c++編譯器的選項。

fc      fortran編譯器的名稱,預設值為 f77。

fflags    fortran編譯器的選項。

3、自動化變數及環境變數

makefile中的自動化變數

自動化變數

表示的意義

$@表示規則中的目標檔案集

$%僅當目標是函式庫檔案時,表示規則中的目標成員名。例如,乙個目標是foo.a(bar.o),那麼,$%就是bar.o,$@就是foo.a。如果目標檔案不是函式庫檔案,其值為空

$<

依賴列表中的第乙個依賴的名字

$?所有比目標新的依賴的合集,以空格分隔

$^所有依賴的集合,以空格分隔。如果依賴中有多個重複的,只保留乙份

$+這個變數很像$^,也是所有依賴的集合,但是它不去除重複的依賴

$*這個變數表示目標模式中「%」及之前的部分

makefile的工作流程:

1、make會在當前目錄下尋找makefile或makefile的檔案

2、如果找到,他會找檔案中的第乙個目標檔案(tager)並把這個檔案作為最終的目標檔案。

3、根據時間戳生成目標檔案

4、遞迴去尋找目標檔案的信賴檔案,並且遞迴生成(同樣有時間戳問題)。

偽目標:只執行命令的的目標

將乙個目標宣告為偽目標需要將它作為特殊目標.phony的依賴。如下:

.phony: cleanclean:rm *.o temp//命令行前加@  符,則此行命令不會輸出

引用其他的makefile及makefile巢狀:

包含:include procmakefile

巢狀:一般使用乙個總控makefile來指明檔案的編譯規則

如:subsystem:

cd subdir && $(make)

其等價於

subsystem:

$(make)  -c subdir

這兩者表達相同的意思:先進入「subdir」目錄中,然後執行make命令;

條件判斷:如

ifeq ($(cc),gcc)

$(cc) -o foo $(objects) $(libs_for_gcc)

else

$(cc) -o foo $(objects) $(normal_libs)

endif

makefile管理命令:

-c dir//讀入指定目錄下面的makefile檔案  c包含的意思

-f dir//指定file檔案為makefile檔案

-i//忽略所有命令的執行錯誤

-i dir//指定makefile被包含在哪個目錄下。

昨晚開會,開到快10點,回來就不早了……,今天繼續

autotools:生成configurater,makefile的自帶工具。

實際工程,會用一些ide,提高開發效率,但用gnu下的工具開發,才是基礎,一些ide都是執行這些基礎。

Linux環境基礎開發

vim的基本操作 正常模式下 ctrl s 凍結螢幕,但輸入的指令依舊輸入到vim中 ctrl q 解凍螢幕 shift 6 行首 shift 4 行尾 gg 進入到文字開始處 shift g 移動到文章最後 w 游標移動到下乙個單詞開始 b 游標移動到上乙個單詞開始 e 游標移動到下乙個單詞末尾 ...

Linux開發環境基礎

vi編輯器常用命令大全 vim常用命令總結 linux之sudo免密碼操作 ubuntu擴充套件根目錄磁碟空間 ubuntu 18.04 國內源 更改pip源與conda源至國內映象 anaconda清華映象源的使用及安裝pytorch失敗問題解決 ubuntu 16.04 ftp伺服器安裝及配置 ...

基礎 構建Python開發環境

1 安裝python 現在python有兩個版本 python 2.x,最新版本為2.7.8 python 3.x,最新版本為3.4.1 linux版本有三個途徑 2 安裝setuptools 只介紹手工安裝方式 進入python安裝目錄,執行 python ez setup.py 編譯生成後檔案清...