1、不同的系統(tǒng)開發(fā)函數(shù)庫的具體步驟是不一樣的,這主要決定于編譯、鏈接環(huán)境。
站在用戶的角度思考問題,與客戶深入溝通,找到瀍河網(wǎng)站設(shè)計(jì)與瀍河網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋瀍河地區(qū)。
2、不同的庫開發(fā)方式也不一樣,現(xiàn)在主流的庫開發(fā)有兩種,一種是靜態(tài)庫,一種是動(dòng)態(tài)庫,兩者的本質(zhì)區(qū)別是庫代碼是否和程序融合在一起,如果組裝在一起就是靜態(tài)庫,如果不組裝在一起,即為動(dòng)態(tài)庫,現(xiàn)在操作系統(tǒng)提供的多數(shù)是動(dòng)態(tài)庫,如Linux平臺的.so文件,windows平臺的DLL文件。
3、以Windows平臺為例,用戶可以通過Vc/vs等IDE集成開發(fā)環(huán)境,生成DLL工程,然后編寫def文件進(jìn)行導(dǎo)出。
#includestdio.h
#includestdlib.h
#includestring.h
#includemalloc.h
#define?max?32
int?ifempty=0;//標(biāo)志,判斷鏈表是無否為空
typedef?struct?dnode?/*?定義雙向鏈表結(jié)構(gòu)體?*/?
{
int?number;?/*?貨物編號?*/
char?name[max];?/*?貨物名稱?*/?
int?counter;?/*?貨物數(shù)量?*/
struct?dnode?*prior,?*next;
/*?定義兩指針,分別指向其前驅(qū)和后繼?*/
}dlnode;?
dlnode?*create(dlnode?*L);
dlnode?*input(dlnode?*L);
dlnode?*output(dlnode?*L);
dlnode?*?outnum(dlnode?*L);
dlnode?*?outname(dlnode?*L);
dlnode?*current(dlnode?*L);
void?search(dlnode?*L);
void?print(dlnode?*L);
void?searchnum(dlnode?*L);
void?searchname(dlnode?*L);
void?display(dlnode?*L)?;
void?main()
{
int?x;
dlnode?*L;
if(!(L=(dlnode?*)malloc(sizeof(dlnode))))?//分配空間
{
printf("\n");
exit(1);
}
create(L);///調(diào)用函數(shù),創(chuàng)建頭節(jié)點(diǎn)
while(1)
{////////////////////////主菜單///////////////////////////
printf("?============================\n");
printf("?1.?貨物出庫和入庫\n");
printf("?2.?查找貨物表\n");?
printf("?3.?顯示倉庫貨物表\n");
printf("?4.?輸出到文件\n");
printf("?0.?退出\n");
printf("?=============================\n");
printf("?選擇0--3:");
scanf("%d",x);
switch(x)
{
case?2:search(L);break;//調(diào)用查找函數(shù)
case?1:current(L);break;//調(diào)用入庫出庫函數(shù)
case?3:display(L);break;//調(diào)用顯示輸出函數(shù)
case?4:print(L);break;//調(diào)用打印函數(shù)
case?0:printf("\n?bye!see?you!\n");
getchar();getchar();exit(0);//退出程序
default:printf("\n?Enter?erreor!please?input?0--4!");?
getchar();getchar();
}
}
}
dlnode?*create(dlnode?*L)//創(chuàng)建鏈表頭節(jié)點(diǎn)
{
printf("?歡迎使用我的倉庫管理系統(tǒng)");
getchar();?
ifempty=0;
///////初始化頭節(jié)點(diǎn)的值////////
L-next=NULL;L-prior=NULL;
L-number=L-counter=0;
strcpy(L-name,"?");?
return?L;
}
void?search(dlnode?*L)?///查找的主要菜單
{
int?y;
if(ifempty==0)
{
printf("沒有輸入貨物!\n");
getchar();getchar();
return;
}
else
{
while(1)
{
printf("=====================\n");
printf("1.按編號查詢\n");
printf("2.按貨物名稱查詢\n");
printf("0.返回上一層\n");
printf("====================\n");
printf("選擇0--2:");
scanf("%d",y);
switch(y)
{
case?1:searchnum(L);break;//調(diào)用按編號查找的函數(shù)
case?2:searchname(L);break;//調(diào)用按名稱查找的函數(shù)
case?0:return;//返回
default:printf("enter?error!Please?input?0--2!\n\n");
getchar();getchar();printf("\n\n");
}
}
}
}
void?searchnum(dlnode?*L)///按編號查找的函數(shù)
{
int?num,flag=0;//flag為是否找到的標(biāo)志
dlnode?*head=L;
if(ifempty==0)
{
printf("沒有貨物被輸入\n");
getchar();getchar();
return;
}
printf("輸入你要查找的貨物編號:\n");
scanf("%d",num);
while((L=L-next)!=head)
{
if(L-number==num)
{?flag=1;//flag為1時(shí)表示找到
printf("找到指定編號貨物?\n");?
printf("\n編號:%d\n",L-number);
printf("名稱:%s\n",L-name)?;
printf("數(shù)量:%d\n\n",L-counter);?
}?
}
if(flag==0)//flag為0時(shí)表示沒有找到
printf("沒有找到指定編號貨物,請查看是否還有貨物。\n");
getchar();getchar();
}
void?searchname(dlnode?*L)//按名稱查找的函數(shù)
{
int?flag=0;//flag為是否找到的標(biāo)志
char?na[32];
dlnode?*head=L;
if(ifempty==0)
{
printf("沒有貨物被輸入\n");
getchar();getchar();
return;
}
printf("輸入你要查找的貨物名稱\n");
scanf("%s",na);
while((L=L-next)!=head)
{
if(strcmp(L-name,na)==0)
{?flag=1;//flag為1時(shí)表示找到
printf("找到指定名稱貨物?\n");?
printf("\n編號:%d\n",L-number);
printf("名稱:%s\n",L-name)?;
printf("數(shù)量:%d\n\n",L-counter);?
}?
}
if(flag==0)//flag為0時(shí)表示沒有找到
printf("沒有找到指定編號貨物,請查看是否還有貨物。\n\n");
getchar();getchar();
}
dlnode?*current(dlnode?*L)//貨物出庫入庫函數(shù)
{
int?y;
while(1)
{
printf("========================\n");
printf("?1.貨物入庫\n");
printf("?2.貨物出庫\n");
printf("?0.返回上一層\n");
printf("========================\n");
printf("?選擇0--2:");
scanf("%d",y);
switch(y)
{
case?1:input(L);break;//調(diào)用入庫函數(shù)
case?2:output(L);break;//調(diào)用出庫函數(shù)
case?0:return(L);//返回上一層
default:printf("enter?error!Please?input?0--2!");
getchar();getchar();
printf("\n\n");
}
}
}
dlnode?*input(dlnode?*L)//定義入庫函數(shù)
{
dlnode?*in,*head;
head=in=(dlnode?*)malloc(sizeof(dlnode));//分配空間
head=L;
printf("\n請輸入貨物數(shù)據(jù):\n");
printf("編號:");scanf("%d",in-number);
printf("名稱:");scanf("%s",in-name);
printf("數(shù)量:");scanf("%d",in-counter);
if(L-next==NULL)?//如果只有頭節(jié)點(diǎn),
{?//把剛輸入的in節(jié)點(diǎn)
L-next=in;?//跟在頭節(jié)點(diǎn)后面
L-prior=in;?//
in-next=L;?//
in-prior=L;?//
ifempty++;?//ifempty加1
}
else
{//如果當(dāng)前L的下一個(gè)節(jié)點(diǎn)不是頭節(jié)點(diǎn)
while((L=L-next)!=head)
{//如果輸入的數(shù)大于L-number,則插到L的前面
if(L-numberin-number)
{
in-next=L;
in-prior=L-prior;?
L-prior-next=in;
L-prior=in;
ifempty++;?//ifempty加1
return(head);
}?
}
//輸入的編號比其它編號都小,則插到最后個(gè)節(jié)點(diǎn),并首尾相連
head-prior-next=in;
in-prior=head-prior;
head-prior=in;
in-next=head;
ifempty++;?//ifempty加1
}?
return?head;
}
dlnode?*output(dlnode?*L)//出庫的函數(shù)
{
int?y;
dlnode?*head=L;
if(ifempty==0)//檢測是否有貨物輸入
{
printf("沒有貨物輸入系統(tǒng)\n");
getchar();getchar();
return(head);
}?
while(1)
{
printf("=============\n");
printf("1.按編號出庫\n");
printf("2.按名稱出庫\n");
printf("0.返回上一層\n");
printf("==============\n");
printf("選擇0--2:");scanf("%d",y);
switch(y)
{
case?1:outnum(L);break;//調(diào)用按編號出庫函數(shù)
case?2:outname(L);break;//調(diào)用按名稱出庫函數(shù)
case?0:return(L);
default:printf("enter?error!Please?input?0--2!");
getchar();getchar();printf("\n\n");
}
}
}?
dlnode?*outnum(dlnode?*L)//按編號出庫函數(shù)
{?
int?num;
dlnode?*head=L;
printf("請輸入出庫貨物的編號:");
scanf("%d",num);
while((L=L-next)!=head)
{//如果找到就刪除節(jié)點(diǎn)
if(L-number==num)
{
L-prior-next=L-next;
L-next-prior=L-prior;
ifempty--;?//ifempty減1?
printf("編號為%d的貨物成功出庫",num);?
getchar();getchar();
return?head;?
}?
}
printf("沒有此編號的貨物,請查看是否還有貨物。\n\n");
getchar();getchar();
return?(head);
}
dlnode?*outname(dlnode?*L)//按名稱出庫函數(shù)
{
char?na[32];
dlnode?*head=L;
printf("請輸入出庫貨物的名稱:");
scanf("%s",na);
while((L=L-next)!=head)
{//如果找到就刪除節(jié)點(diǎn)
if(strcmp(L-name,na)==0)
{
L-prior-next=L-next;
L-next-prior=L-prior;
ifempty--;?//ifempty減1?
printf("名稱為%s的貨物成功出庫",na);
getchar();getchar();
return?(head);
}
}
printf("沒有此名稱的貨物,請查看是否還有貨物。\n\n");
getchar();getchar();
return(head);
}?
void?display(dlnode?*L)//顯示貨物清單
{
dlnode?*head=L;
if(ifempty==0)
{
printf("沒有貨物可顯示\n");
getchar();getchar();
return;
}
L=L-next;
do
{?
printf("\n編號:%d\n",L-number);
printf("名稱:%s\n",L-name)?;
printf("數(shù)量:%d\n\n",L-counter);
}while((L=L-next)!=head);
getchar();getchar();?
}
void?print(dlnode?*L)
{
dlnode?*head=L;
L=L-next;
char?filename[max];
FILE?*out;
if(ifempty==0)
{
printf("沒有貨物可輸出\n");
getchar();getchar();
return;
}
printf("請輸入文件名稱:");
scanf("%s",filename);
if((out=fopen(filename,"w"))==NULL)
{
printf("打開文件失敗!\n");
getchar();getchar();
return;
}
do{?
fprintf(out,"編號:%d\n名稱:%s\n數(shù)量:%d\n\n",L-number,L-name,L-counter);
}while((L=L-next)!=head);
printf("輸出成功\n");getchar();getchar();
fclose(out);
}
簡單的一個(gè)例子,但是基本的程序編譯的思想都在里面了,具體的需要你自己體會(huì)和查資料
跟著下面的步驟走
------------------------
第一步:我的電腦-屬性-高級-環(huán)境變量
添加3個(gè)變量
1.名字:path 值:vc的安裝目錄里面包含cl.exe的bin目錄路徑+";"+vc目錄下包含mspdb80.dll的目錄的路徑
比如我的是D:\Program Files\Microsoft Visual Studio 8\VC\bin;D:\Program Files\Microsoft Visual Studio 8\Common7\IDE;
2.名字:include 值:vc安裝目錄下的include目錄,主要是為了找到頭文件,我的是D:\Program Files\Microsoft Visual Studio 8\VC\include;D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include;
3.名字:lib 值:vc目錄下包含庫文件的目錄路徑
我的是D:\Program Files\Microsoft Visual Studio 8\VC\lib;D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib;
第二步:需要下面兩個(gè)文件
//-------------libdemo.c
#include stdio.h
void lib_func()
{
printf("this routine in lib\n");
}
//------------main.c
void lib_func();
int main(int argc, char *argv[])
{
lib_func();
}
第三步:命令
cl /c libdemo.c '編譯libdemo.c 生成libdemo.obj
lib libdemo.obj '生成libdemo.lib 庫文件
cl /c main.c '編譯main.c
link main.obj libdemo.lib '生成main.exe
---------------------------------------------------
呵呵 加點(diǎn)東西,參看4樓的建議,在做個(gè)dll,COM組件就不做了,有點(diǎn)復(fù)雜了
1。把libdemo.c 稍微改下
//-------------libdemo.c
#include stdio.h
__declspec (dllexport) void lib_func()
{
printf("this routine in lib\n");
}
2。命令
cl /c libdemo.c main.c
link libdemo.obj /dll '生成libdemo.lib
link main.obj libdemo.lib
哈哈,選我吧!庫分靜態(tài)庫和動(dòng)態(tài)鏈接庫,靜態(tài)庫以lib結(jié)尾,被編譯器里的鏈接器識別。windows下動(dòng)態(tài)庫以dll結(jié)尾,被操作系統(tǒng)加載以模塊方式映射到進(jìn)程地址空間。一般初學(xué)者先學(xué)會(huì)創(chuàng)建的是靜態(tài)庫。靜態(tài)庫是一個(gè)無需重定位的函數(shù)集。怎么做到無需重定位呢?這是編譯器做的編譯工作,例如它指定開頭的位置作為基址,剩下的代碼用到的都是相對偏移。這樣,這段二進(jìn)制代碼可以被放在內(nèi)存中的任何位置執(zhí)行,被寫入了lib文件里。在lib文件里,包含了函數(shù)名與函數(shù)地址組成的結(jié)構(gòu)體,通過它編譯器可以找到lib文件里需要的二進(jìn)制代碼并以靜態(tài)聯(lián)編的方式寫入我們調(diào)用它的exe文件里。這種代碼是被塞進(jìn)exe文件里而無需修改,并在程序執(zhí)行時(shí)被用到。為了讓庫被別人調(diào)用,我們可以寫一個(gè)頭文件.h,包含函數(shù)原型及聲明。