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: clean
clean:
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 編譯生成後檔案清...