C語言----創(chuàng)建工程庫最佳選擇(CSEN-e小白管理員-Half_word編寫)
咕咕咕,這陣子事情有點多… …
===========================================================
正文:
C語言----創(chuàng)建工程庫最佳選擇
??前陣子有童鞋問:“我寫了一些功能很不錯的代碼;結(jié)果做課設(shè)了同學(xué)過來找我想借用,但是我又不想開源它們……?!庇谑且鰜斫裉斓闹鹘?strong>”靜態(tài)庫”or”動態(tài)庫”。
??先簡單進行一下科普:
1.靜態(tài)庫和動態(tài)庫是什么?
動態(tài)庫:動態(tài)庫提供了一種方法,使進程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù)。函數(shù)的可執(zhí)行代碼位于一個 DLL 文件中,該 DLL 包含一個或多個已被編譯、鏈接并與使用它們的進程分開存儲的函數(shù)。DLL 還有助于共享數(shù)據(jù)和資源。多個應(yīng)用程序可同時訪問內(nèi)存中單個 DLL 副本的內(nèi)容。
靜態(tài)庫:靜態(tài)庫是指在我們的應(yīng)用中,有一些公共代碼是需要反復(fù)使用,就把這些代碼編譯為“庫”文件;在鏈接步驟中,將從庫文件取得所需的代碼,復(fù)制到生成的可執(zhí)行文件中的這種庫。
?
不難看出,動態(tài)庫貌似是一個大的“花心蘿卜”,明明只有一個副本,卻讓同時訪問的進程都以為這是它獨有的庫,最后運行的時候才進行載入。沒錯,這操作就是Windows專業(yè)手法;每個在windows上運行的進程也以為它獨占了整個內(nèi)存(實際上那都是線性地址)。
靜態(tài)庫相比之下就老實多了:每個使用它的進程都直接復(fù)制一份所需的代碼,大家在生成可執(zhí)行文件之前就明確了一一對應(yīng)的關(guān)系。
上述兩種庫也體現(xiàn)出軟件工程對于空間與時間的一種平衡取舍,靜態(tài)庫犧牲了空間,贏得了空間;動態(tài)庫反之。另外值得一提的是使用動態(tài)庫的程序不能離開動態(tài)庫;所以經(jīng)常在Windows下可以看到報錯:缺少xx.dll。而靜態(tài)庫生成的程序就不存在這種限制了,為嘛?人家在運行之前加載進了程序。
2. 如何構(gòu)建?
作為一個C語言熱愛分子表示,做這種東西小菜一碟!
巴特,首先你得有一個運行環(huán)境……
本文主要以Windows與Linux兩大系統(tǒng)為例(MCU小伙伴莫慌,Keil也可以使用lib文件的;傳送門:https://blog.csdn.net/yunfeiyang62/article/details/47211209
Linux:
首先講Linux,比起Windows來使用,因其操作更加簡單。首先裝機必備gcC;然后創(chuàng)建一個頭文件(存放你的各種定義,以及函數(shù)原型聲明);然后再將你的函數(shù)實現(xiàn)寫入另外一個.c文件。
如下圖1:

Windows:
作為微軟主要的陣地,首先你得準備好一個VS2019(其它版本也可以,或者直接Keil)。
還是和linux里面一樣建立一個頭文件與.c文件。先保存好;再打開VS創(chuàng)建一個靜態(tài)庫工程或者是一個動態(tài)庫工程。
庫項目直接寫在里面你的庫函數(shù),官方給了一套模板,要是覺得名字不好聽右鍵>重命名(記得將頭文件一并修改,還有將項目屬性里面的也一并修改)
最后在工程目錄的DEBUG目錄下找到生成的.lib或.dll;取出并且與頭文件一并打包。
3.如何使用?
由于Windows下使用較為復(fù)雜(keil中比VS來的簡易),用文字描述過于繁瑣
筆者給出傳送門https://www.bilibili.com/video/BV1Kt411775b,自行探索。
仍然以Linux為例:
將你的.a與.so都用mv指令移動到/usr/lib/下;然后輸入ldconfig建立連接關(guān)系。
創(chuàng)建一個mian.c,用#include “HelloH.h”包含前面寫的頭文件,然后把你需要的函數(shù)調(diào)用就好了。保存。
再輸入:gcc -I./ main.c -lHello -o LibMain.out//使用靜態(tài)庫
? ? ? ? ? ? ?? gcc -L./ main.c -lHi -o SoMain.out//使用動態(tài)庫
接著就可以執(zhí)行查看效果了。
4. 如何分享?
其實說到這個,我們不妨打開電腦上隨意一個程序得安裝路徑,可以看到:一堆的.dll或者.lib,有的是在lib文件夾中。
如果想給別人使用就創(chuàng)建兩個文件夾吧include、lib;頭文件送入include,庫文件則放在lib。最后寫個README,壓縮出包,大功告成!