树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况
一、分文件編程案例
好處:
? ? ? ? 分模塊的編程思想????????
? ? ? ?(eg: 網絡交給 ????????????a同事?來做
? ? ? ? ????????超聲波交給 ????????b同事來做
? ? ? ? ????????電機交給? ? ? ? ? ? ? c同事來做)
? ? ? ? ?a.功能責任劃分
? ? ? ? ?b.方便調試
? ? ? ? c.主程序簡潔
二、庫
a、靜態庫
靜態函數庫:是在程序執行之前(編譯)就加入到目標程序當中去了
優點:運行快
缺點:大
b、動態庫
動態函數庫:是在程序執行時動態(臨時)由目標程序去調用
缺點:運行慢
優點:小
??三、庫的制作
靜態庫的的制作:格式xxxx.a
a、gcc calcufuncs.c -c? ? ? ? ? ? ????????????????????????????????生成xxxx.o文件
b、ar rcs libcalcufunc.a calcufuncs.o? ? ? ? ? ? ? ? ? ? ? ? ? xxxx.o文件生成xxxx.a靜態庫文件
?
動態庫的制作:
?gcc -shared -fpic calcufuncs.c -o libcalc.so
-shared? 指定生成動態庫
-fpic? ? 標準? ? ? ? fpic選項作用于編譯階段,在生成目標文件時就得使用該選項,以生成位置無關的代碼
四、庫的使用
靜態庫:
? ? ? ? ? ? ? ? gcc calculatorT.c -lcalcufunc -L ./ -o mainProStasic
? ? ? ? ? ? ? ? ? -lcalcufunc? ? -l 是指定要用的動態庫,庫名砍頭去尾
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -L告訴gcc編譯器從-L指定的路徑去找靜態庫。默認是從
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /usr/lib? ? 或者? ?/usr/local/lib 去找
? ? 動態庫:? ? ?
????????gcc calcuatorT.c -lcalc -L ./ -o mainProDy? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ????????? ? libcalc.so
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????也是砍頭去尾? ?
帶動態庫的程序
可以指定該程序運行時候,在LD_LIBRARY_PATH 所指定的路徑去找庫文件
export LD_LIBRARY_PATH="/home/pi/back/tset"
相關代碼的實現:
一、分文件編程案例相關代碼
先新建一個back 文件夾
?
?新建一個叫calculatorT.c的文件
這是具體的代碼
?
?
?運行結果
分文件的思想是,能不能把加減乘除寫在另一個文件里面
main是程序的主入口函數
main函數上面的函數則是功能性函數
? ? ? ? ? ? ? ? 1、串口
? ? ? ? ? ? ? ? 2、網絡
? ? ? ? ? ? ? ? 3、線程
? ? ? ? ? ? ? ? 4、語音
? ? ? ? ? ? ? ? 5、加法 乘法 減法 除法
新建一個test的文件夾
然后把calculatorT.c? 復制到當前目錄下(也就是test下面)
改個名字
?我要把它的main函數全部去掉,留下加減乘除,就可以啦
同樣的主函數里面我們也把沒有的去掉
?留下main函數
?那么我這兩個文件怎樣才能聯合起來呢?
兩個文件一起編輯,理論上會出錯
?那么如何才能去掉這些警告呢?
我們先運行起來,看看能不能運行
運行起來也可以(理論上應該報錯)
理論上我們還需要一個函數的聲明
起一個跟.c 文件一樣名字的.h 文件
然后修改.h文件
把函數體給他去掉,留下函數的原型
記得后面寫個分號,這叫函數的聲明
然后要把頭文件.h包含到主程序里面
??那么為什么有的頭文件用<>,有的用""號呢?
<>的意思是,默認的情況下,從usr/include里面找或者去usr/local/include里面去找頭文件
?里面有這么多頭文件
假設我們想看stdio的
如果你寫""號呢?
他會優先從當前路徑來找
比如現在我們的代碼在test的位置
會從當前位置找找看有沒有頭文件,有的話引用這個頭文件,沒有的話去默認的的usr/include里面找或者去usr/local/include里面去找頭文件,找不到就報錯
?運行一下
沒有任何警告生成了a.out
?運行一下
?這就是分文件,就是把一個文件拆分成兩個而已
二、靜態庫的制作和使用相關代碼
靜態庫制作:
主程序不是拿來打包的,我們打包的是功能程序
gcc calcufuncs.c -c? ? ? ? ? ? ????????????????????????????????生成xxxx.o文件
?如果我們遇見不認識的
比如不認識里面的ar
可以ar 或者ar --help
?ar rcs libcalcufunc.a calcufuncs.o? ? ? ? ? ? ? ? ? ? ? ? ? xxxx.o文件生成xxxx.a靜態庫文件
靜態庫的使用:
被誰用?當然是被主函數拿來用啦
你給別人的時候給.a和.h就可以啦
~是工作目錄
*是通配符
(下面的意思:所有以calcufuncs開頭的文件都給他移到工作目錄中去,工作目錄就是home/pi)
?我們移出去多了,還得把.h移回來
你給別人提供的是.a 和.h 文件
用你的東西.a就夠了,但是你必須把.h頭文件給他,要不然它不知道你給的頭文件有哪些函數
?(最好寫點注釋,都是干啥的)
????????
這樣別人在用的時候就可以砍頭去尾
顯示有一個報錯
因為-l有點像頭文件,他會優先從usr/lib下面去找
那我們想要它從當前路徑來找怎么辦呢?
我們給他加一個-L,從指定路徑,當面路徑開始找,如果當前路徑沒有,再從usr/bin里面找,或者從usr/local/bin里面找
?然后可以給他取個名字
./代表當前路徑
把這個.c文件編譯去鏈接這個靜態庫(calcufunc),在哪找這個靜態庫呢?./在當面路徑下鏈接
運行
這樣既做到了你寫的功能給了別人,還做到了代碼的保護,別人不知道你是怎么實現的
? ? gcc calculatorT.c -lcalcufunc -L ./ -o mainProStasic
? ? ? ? ? ? ? ????????????????? ? -lcalcufunc? ? -l 是指定要用的動態庫,庫名砍頭去尾( libcalcufunc.a里面的lib去掉,.a去掉)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -L告訴gcc編譯器從-L指定的路徑去找靜態庫。默認是從
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /usr/lib? ? 或者? ?/usr/local/lib 去找
三、動態庫的制作和使用相關代碼
假如你開發了一個程序,程序不想給別人源碼,你只想給人家庫
通常我們做開發只寫一個.c 和.h 給人家
那我現在要把.c 變成動態庫
?gcc -shared -fpic calcufuncs.c -o libcalc.so
-shared? 指定生成動態庫
-fpic? ? 標準? ? ? ? fpic選項作用于編譯階段,在生成目標文件時就得使用該選項,以生成位置無關的代碼
?
把生成的動態庫拷貝到test里面
(動態庫和靜態庫的命名不一樣
靜態庫libxxxxx.a
動態庫libxxxxxx.so
so是動態庫的意思,.a是靜態庫的意思
這個.so 跟window 的.dll有點像)
?我們自己做的時候不關心版本號
?編譯主程序,也是找不到的
用-L指定從當前文件夾來找
?他的使用和靜態庫一樣
????????gcc calcuatorT.c -lcalc -L ./ -o mainProDy? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ????????? ? libcalc.so
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????也是砍頭去尾? ?
執行不起來
?為什么呢?因為靜態庫和動態庫的區別
?
?
?而我們動態庫提示找不到動態庫
?為什么呢??
因為動態庫是程序執行過程中由目標臨時去調用(也就是說它運行的時候會去到處找這個庫)
靜態庫不需要找,因為他已經編譯到這個程序里面去了
有一種解決方法,把他copy到usr/lib里面去
他會默認去usr/lib里面去找
?我們給他刪掉再來運行
又有錯誤
?那我們如何才能指定運行的時候到當前路徑去找呢?
你直接敲export會把系統的環境變量列出來
?然后?選擇第二種方式
帶動態庫的程序
可以指定該程序運行時候,在LD_LIBRARY_PATH 所指定的路徑去找庫文件
export LD_LIBRARY_PATH="/home/pi/back/tset"
?但是這個環境變量是臨時的,只是針對這個窗口,換一個窗口呢?
?也不行
所以我們可以寫一個腳本
?腳本里面的內容
?
然后給這個腳本一個可執行的權限
?結果
換一個窗口執行start.sh 也是一樣的
?shell腳本,就是把多個指令并在一起
那我們再來計算一下文件的大小
du 是計算文件大小的意思
理論上動態庫會更小
? ? ? ? 補充:
有時候端口號莫名的找不到了
你咋連也連接不上去
需要下載解壓這個文件?
打開這個文件?
有時候安裝失敗,你可以先點擊卸載再安裝
?
?這時候就能打開樹莓派了
?用戶名pi
密碼raspberry
總結
以上是生活随笔為你收集整理的树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 树莓派和windows的FileZill
- 下一篇: 有公司还有什么车呢?