新聞中心
Linux C中如何導(dǎo)出鏈接庫 詳細教程

專業(yè)從事網(wǎng)站設(shè)計、做網(wǎng)站,高端網(wǎng)站制作設(shè)計,微信小程序定制開發(fā),網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團隊竭力真誠服務(wù),采用H5技術(shù)+CSS3前端渲染技術(shù),響應(yīng)式網(wǎng)站設(shè)計,讓網(wǎng)站在手機、平板、PC、微信下都能呈現(xiàn)。建站過程建立專項小組,與您實時在線互動,隨時提供解決方案,暢聊想法和感受。
在Linux下使用C語言編寫程序時,經(jīng)常會使用庫函數(shù)來簡化程序的編寫以及提高程序的運行效率。為了方便程序的開發(fā)和維護,我們可能需要將自己編寫的一些函數(shù)封裝成庫函數(shù),以方便在其他程序中調(diào)用。本文將詳細介紹Linux C中如何導(dǎo)出鏈接庫。
一、什么是鏈接庫
鏈接庫(Library)是將多個函數(shù)放在一起構(gòu)成的、可被其他程序調(diào)用的二進制文件。鏈接庫可分為動態(tài)鏈接庫(Dynamic Library)和靜態(tài)鏈接庫(Static Library)兩種類型。
靜態(tài)鏈接庫將庫函數(shù)的代碼完全復(fù)制到目標(biāo)程序中,程序在運行時不需要再加載該庫函數(shù),因此程序的運行效率較高,但該庫函數(shù)需要和程序一起發(fā)布,導(dǎo)致程序文件較大。
動態(tài)鏈接庫則將庫函數(shù)的代碼存儲在單獨的文件中(通常為.so文件),程序在運行時需要先將該庫函數(shù)加載到內(nèi)存中才能運行庫函數(shù)。這種方式可以使得程序文件較小,同時也方便庫函數(shù)的更新和維護。
二、編寫庫函數(shù)
在編寫庫函數(shù)時,需要注意以下幾點:
1.定義函數(shù)的接口和返回值類型,確保函數(shù)可以正確地被其他程序調(diào)用;
2.為了保證庫函數(shù)的可重用性,需要保證函數(shù)的輸入輸出參數(shù)能夠適應(yīng)多種場景;
3.為了避免函數(shù)名沖突,應(yīng)該給函數(shù)名添加前綴,例如lib_。
假設(shè)我們要編寫一個庫函數(shù),該函數(shù)用于計算兩個數(shù)的和。下面是實現(xiàn)代碼:
“`
/*add.h*/
#ifndef ADD_H
#define ADD_H
int lib_add(int a, int b);
#endif
/*add.c*/
#include “add.h”
int lib_add(int a, int b)
{
return a + b;
}
“`
在上述代碼中,我們定義了一個名為lib_add的函數(shù),該函數(shù)的輸入?yún)?shù)為兩個整型數(shù)a和b,輸出參數(shù)為它們的和。我們將該函數(shù)封裝在了add.h和add.c兩個文件中,以便其他程序調(diào)用。
三、生成鏈接庫
在Linux下,生成鏈接庫有兩種方式:靜態(tài)鏈接和動態(tài)鏈接。
1.靜態(tài)鏈接
使用靜態(tài)鏈接庫時,鏈接器將被調(diào)用的庫函數(shù)的代碼復(fù)制到目標(biāo)程序中,目標(biāo)程序不需要再搜索庫文件,這種鏈接方式生成的可執(zhí)行文件較大,但可執(zhí)行文件不依賴庫文件,因此便于程序的移植。
生成靜態(tài)鏈接庫需要使用ar和ranlib命令,具體步驟如下:
1)編譯庫文件
在終端中輸入以下命令:
“`
gcc -c -fPIC add.c
“`
選項含義:
-c:編譯、匯編,但不進行鏈接。
-fPIC:產(chǎn)生位置無關(guān)代碼,用于編譯動態(tài)鏈接庫
2)打包庫文件
在終端中輸入以下命令:
“`
ar -r libadd.a add.o
ranlib libadd.a
“`
ar與ranlib命令的作用是將目標(biāo)文件打包成歸檔文件(Archive)。其中ar -r libadd.a add.o表示將add.o文件打包進libadd.a文件中,-r選項意味著在歸檔文件中插入一個或多個檔案文件,并更新歸檔文件的目錄(Table of Contents)。ranlib libadd.a用于更新歸檔文件的目錄(TOC)以加快歸檔文件的訪問速度。
打包之后生成了一個名為libadd.a的庫文件,該文件可以被其他程序鏈接使用。
2.動態(tài)鏈接
動態(tài)鏈接庫是指可重定位對象形式存放在系統(tǒng)中,在程序鏈接時只需記錄庫文件的路徑和文件名,程序運行時再將庫文件加載進內(nèi)存中,因此該鏈接方式可以方便程序庫的更新或移植。
生成動態(tài)鏈接庫同樣需要編譯和打包兩個步驟,具體步驟如下:
1)編譯庫文件
在終端中輸入以下命令:
“`
gcc -shared -fPIC -o libadd.so add.c
“`
選項含義:
-shared:編譯成共享庫,即動態(tài)鏈接庫
-o:指定輸出文件
2)將庫文件拷貝到系統(tǒng)庫目錄中
在終端中輸入以下命令:
“`
sudo cp libadd.so /usr/lib
sudo ldconfig
“`
上述代碼會將libadd.so動態(tài)鏈接庫文件拷貝到/usr/lib目錄下,并使用ldconfig命令將庫文件包含到共享庫的動態(tài)鏈接器路徑列表中。
四、使用鏈接庫
使用鏈接庫需要先在程序中添加頭文件,然后在鏈接時引用庫文件。
1.靜態(tài)鏈接庫
使用靜態(tài)鏈接庫時,需要在編譯時引用庫文件,具體步驟如下:
在終端中輸入以下命令:
“`
gcc -o mn mn.c -L. -ladd
“`
選項含義:
-o:指定輸出文件名
-L:指定鏈接庫文件路徑
-l:指定鏈接庫文件名,生成的可執(zhí)行文件中將包含該庫的代碼
其中,-L.表示鏈接器在當(dāng)前目錄中查找?guī)煳募?ladd表示鏈接libadd.a庫文件。
2.動態(tài)鏈接庫
使用動態(tài)鏈接庫時,程序運行時將加載庫文件,具體步驟如下:
在終端中輸入以下命令:
“`
gcc -o mn mn.c -L. -ladd
“`
選項含義:
-o:指定輸出文件名
-L:指定鏈接庫文件路徑
-l:指定鏈接庫文件名,生成的可執(zhí)行文件中將包含該庫的代碼
其中,-L.表示鏈接器在當(dāng)前目錄中查找?guī)煳募?ladd表示鏈接libadd.so庫文件。
五、
本文詳細介紹了Linux C中如何導(dǎo)出鏈接庫。在編寫庫函數(shù)時,需要注意輸入輸出參數(shù)的適應(yīng)性以及命名規(guī)范。在生成鏈接庫時,分為靜態(tài)鏈接和動態(tài)鏈接兩種方式,需要使用不同的命令,生成的庫文件也有不同的特點。在鏈接時需要指定庫文件路徑和庫文件名,并在程序中添加頭文件以供調(diào)用。
相關(guān)問題拓展閱讀:
- linux下c語言連接Mysql
- 關(guān)于 Linux c 的函數(shù)庫文件的 路徑問題
linux下c語言連接Mysql
#include “/usr/local/mysql/include/mysql/mysql.h” /*為絕對路徑*/
#include
int main()
{
char *user = “vod”, *pwd = “vod”, *dbname = “vod”, *host=”211.161.159.106″;
MYSQL mysql;
MYSQL_RES *mysql_ret;
MYSQL_ROW mysql_row;
unsigned long num_rows;
int ret;
mysql_init(&mysql);
if(mysql_real_connect(&mysql,host,user,pwd,dbname,0,NULL,0))
{
printf(“Connection success!\n”);
ret = mysql_query(&mysql,”select * from user”);
if(!ret)
{
printf(“Query Success!\n”);
mysql_ret = mysql_store_result(&mysql);
if(mysql_ret != NULL)
{
printf(“早姿沒Store Result Success!\n”);
num_rows = mysql_num_rows(mysql_ret);
if(num_rows != 0)
{
printf(“%d\n”,num_rows);
while(mysql_row = mysql_fetch_row(mysql_ret))
{
printf(“%s\t%s\t%s\t%s\t%s\t%s\n”,mysql_row,mysql_row,mysql_row,mysql_row,mysql_row,mysql_row);
}
}
else
{
printf(“mysql_num_rows Failed!\n”);
return(-1);
}
mysql_free_result(mysql_ret);
return(0);
}
else
{
printf(“Store Result Failed!\n”);
return(-1);
}
}
else
{
printf(“Query Failed!\n”);
return(-1);
}
}
else
{
printf(“Connection Failed\n”);
return(-1);
}
}
自己看吧,寫的我累死了陸納,運行沒問題的。流程都在里面了。你會用GCC編譯器編譯它吧?(廢話,呵呵,不過注意帶幾個mysql下的動態(tài)鏈接庫冊掘)
老大,原來你連 C 的原理都不會啊?
C 語言所有頃游調(diào)用函數(shù)毀伍,都要有聲明,這種外部函數(shù)庫的調(diào)用,都要用他們的 header 文件來聲明函數(shù)變量等等的東西,編譯器會根據(jù)實際情況去把這些程序里面的函數(shù)調(diào)用鏈接到函數(shù)庫的正確位置上。
微軟的產(chǎn)品因為他壟斷了他自己系統(tǒng)的所有功能設(shè)計。所以他的系統(tǒng)+他的開發(fā)程序+他的開發(fā)函數(shù)庫就不需要 header 文件了,因為它可以設(shè)計為 dll 本身含有足夠的信息去干別的事情了。所以,你別以為你用了微軟的 .net ,他就還是 C 語言了。他已經(jīng)脫離了 C 語言的范圍了。
GCC一般情況下是編譯器,但編譯器是不夠的,還需要連接器的工作才行。binutils 里面的軟件提供相關(guān)的功能。
要知道以前鏈接到函數(shù)庫功能,光有 header 和函數(shù)庫文件本體還是不行的,還需要另外的函數(shù)庫信息文件來幫助編譯器連接器來找到正確的函數(shù)入口位置才行的。
你編程 C ,你要選擇你所使用的功能調(diào)用方法,GCC 一般調(diào)用 mysql 有調(diào)用外部 dll ,或者程序自己直接鏈接 mysql 端口,自己分析 mysql 服務(wù)進程發(fā)送的各種信息!
前一種辦法,可以直接選擇 mysql 客戶端里面的 SDK 來直接獲得官方的功能支持,但官方 MySQL 是 GPL 協(xié)議發(fā)布的,你使用他的功能接口后,你的程序也必須以 GPL 發(fā)布,不然你就要去選擇其他的函數(shù)庫,比如 ODBC 的 mysql 庫。當(dāng)然還有第三方的 mysql 功能庫可以選擇。
不過你要注意,LGPL 必須嚴(yán)格區(qū)分你的程序和 LGPL 代碼。你必須動態(tài)鏈接到纖乎或 LGPL 函數(shù)庫。如果你的程序包含 LGPL 函數(shù)庫一起發(fā)布,且 LGPL 庫是你的軟件的必備函數(shù)庫,那么你的程序也必須開源,但不是 GPL 而是 LGPL !
不然你就選擇自己寫程序直接與 mysql 服務(wù)器進行數(shù)據(jù)傳輸,不使用第三方功能庫。
但我不認(rèn)為身為一個 Linux 下程序開發(fā)人員,會去傻傻的自己寫功能函數(shù)而不是用現(xiàn)成的函數(shù)庫。
你所遇到的“非要客戶安裝 mysql client ”,就是因為你的軟件調(diào)用了一些非你自己編寫的函數(shù)調(diào)用功能,而為了獲取這些函數(shù)而需要安裝幾個 mysql 函數(shù)庫的問題。
這個問題我想不應(yīng)該是一個開發(fā)人員提出來的吧?
樓主你還是重新學(xué)習(xí) C 語言吧。.net 的 C 被微軟改的不是真正的 C 語言了,所以你沒辦法按照 C 的標(biāo)準(zhǔn)去比較 .net 和 GCC 的。
而且很多 .net 的編程習(xí)慣也沒辦法延續(xù)到 GCC 的。
和.net同樣的道理,你在譽歷局銀.net也需要在你的部署包中包含dll才能去連接,除非你靜態(tài)聯(lián)接了相關(guān)的code, 在linux下你需要下載mysql的C庫開發(fā)包(libmysql++-dev libmysql++2c2a libmysqlclient15-dev libmysqlclient15off) 這里面已經(jīng)包含了動態(tài)庫和靜態(tài)庫,如果是靜態(tài)庫鏈接,你就慶臘搜只需要把你的程序部署給別人即可,如果是動態(tài)鏈接,還需要把相關(guān)的.so也包含在你的部署包中分發(fā)給使用者
關(guān)于 Linux c 的函數(shù)庫文件的 路徑問題
要學(xué)會用瞎核宴man,特別是man 氏橘2(系統(tǒng)調(diào)用)和man 3(C函數(shù)庫),比如:
man sqrt
會顯示需要引用的頭文件,編譯時需要的動態(tài)鏈接庫
如果重復(fù),則需要指定手冊章節(jié),比如
man write 顯示的是write程磨銀序幫助,如果想看系統(tǒng)調(diào)用,則要輸入man 2 wirte
另外,/lib64:/lib:/usr/lib64:/usr/lib這些是系統(tǒng)缺省的,不用指定
求神幫助我想找string庫哪目錄我想看看函數(shù)定義
關(guān)于linux c 導(dǎo)出鏈接庫 039的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
當(dāng)前標(biāo)題:LinuxC中如何導(dǎo)出鏈接庫詳細教程(039)(linuxc導(dǎo)出鏈接庫039)
文章地址:http://www.dlmjj.cn/article/dpgjede.html


咨詢
建站咨詢
