




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、www.si-Unix系統(tǒng)下系統(tǒng)下C 編程編程北京神州數(shù)碼思特奇信息技術(shù)股份北京神州數(shù)碼思特奇信息技術(shù)股份研討院研討院例如例如C程序程序 設(shè)有一個(gè)文件名為設(shè)有一個(gè)文件名為hello.c的程序,其內(nèi)容為:的程序,其內(nèi)容為:#includemain()printf(“Hello World!n”);編譯和執(zhí)行步驟編譯和執(zhí)行步驟編譯編譯 gcc hello.c #生成可執(zhí)行程序生成可執(zhí)行程序a.out,或,或gcc o hello hello.c #生成可執(zhí)行程序生成可執(zhí)行程序hello運(yùn)轉(zhuǎn)運(yùn)轉(zhuǎn) ./a.out或或 ./hello 輸出結(jié)果輸出結(jié)果 Hello World! 綱綱 要要 編譯器編譯器
2、 頭文件頭文件 鏈接器與庫(kù)文件鏈接器與庫(kù)文件 靜態(tài)庫(kù)靜態(tài)庫(kù) 共享庫(kù)共享庫(kù) 功能及用法功能及用法 為什么要運(yùn)用編譯器?為什么要運(yùn)用編譯器?C言語(yǔ)源程序需求經(jīng)過(guò)編譯和鏈接這兩個(gè)過(guò)程才干轉(zhuǎn)換成言語(yǔ)源程序需求經(jīng)過(guò)編譯和鏈接這兩個(gè)過(guò)程才干轉(zhuǎn)換成二進(jìn)制可執(zhí)行程序。二進(jìn)制可執(zhí)行程序。普通在普通在Unix系統(tǒng)中運(yùn)用的系統(tǒng)中運(yùn)用的C編譯器是編譯器是ccC Compiler的的縮寫(xiě)。在各個(gè)縮寫(xiě)。在各個(gè)Linux發(fā)行版本中廣泛運(yùn)用的發(fā)行版本中廣泛運(yùn)用的C編譯器編譯器名為名為gccGNU cc。為了堅(jiān)持與。為了堅(jiān)持與Unix系統(tǒng)的兼容,系統(tǒng)的兼容,在在Linux系統(tǒng)中系統(tǒng)中cc作為了作為了gcc的一個(gè)鏈接。的一個(gè)鏈接
3、。gcc的功能的功能gcc能將能將C/C+源程序和目的程序編譯并調(diào)用鏈接程序源程序和目的程序編譯并調(diào)用鏈接程序ld生成可生成可執(zhí)行文件,假設(shè)用戶沒(méi)有給出可執(zhí)行文件的名字,執(zhí)行文件,假設(shè)用戶沒(méi)有給出可執(zhí)行文件的名字,gcc將默許生將默許生成一個(gè)名為成一個(gè)名為a.out的可執(zhí)行文件。的可執(zhí)行文件。 gcc的用法的用法gcc的普通用法為:的普通用法為:gcc options 其常用格式為:其常用格式為:gcc -c-S-E-s-g-static-shared-rdynamic-Idir -Ldir -lmylib -Olevel-x Language -Dmacro=defn -Umacro-mma
4、chine-option -o out_file infile 幾點(diǎn)闡明幾點(diǎn)闡明gcc根據(jù)源程序的擴(kuò)展名來(lái)決議運(yùn)用哪一種言語(yǔ)的編譯器進(jìn)展編譯根據(jù)源程序的擴(kuò)展名來(lái)決議運(yùn)用哪一種言語(yǔ)的編譯器進(jìn)展編譯任務(wù)。任務(wù)。擴(kuò)展名為擴(kuò)展名為“.c的文件被的文件被gcc以為是以為是C言語(yǔ)的源程序文件。例如:言語(yǔ)的源程序文件。例如:gcc hello.cgcc編譯出來(lái)的可執(zhí)行程序默許是編譯出來(lái)的可執(zhí)行程序默許是a.out。g+是一個(gè)是一個(gè)C+版本的版本的gcc編譯器。編譯器。g+要求要求C+言語(yǔ)源程序文件帶有擴(kuò)展名言語(yǔ)源程序文件帶有擴(kuò)展名“或或“.C。例如:。例如:g+ hello, g+ hello.C參數(shù)參數(shù)
5、-c:編譯后僅輸出:編譯后僅輸出*.o型的目的文件,而不銜接生成可執(zhí)型的目的文件,而不銜接生成可執(zhí)行程序行程序 -S:編譯后僅生成匯編言語(yǔ)文件:編譯后僅生成匯編言語(yǔ)文件*.s,但不生成目的文件,但不生成目的文件和可執(zhí)行代碼和可執(zhí)行代碼 -s:生成可執(zhí)行文件時(shí),刪除符號(hào)表和重定位信息。生:生成可執(zhí)行文件時(shí),刪除符號(hào)表和重定位信息。生成廢品軟件時(shí)運(yùn)用成廢品軟件時(shí)運(yùn)用 -E:在預(yù)處置過(guò)程后終了,不進(jìn)展編譯和銜接,也不生:在預(yù)處置過(guò)程后終了,不進(jìn)展編譯和銜接,也不生成可執(zhí)行代碼成可執(zhí)行代碼 -g:在可執(zhí)行文件中參與調(diào)試信息,便于程序的調(diào)試:在可執(zhí)行文件中參與調(diào)試信息,便于程序的調(diào)試參數(shù)續(xù)參數(shù)續(xù)-o o
6、utfile:指定輸出文件名。假設(shè)不指定那么生成:指定輸出文件名。假設(shè)不指定那么生成a.out-Idir:將目錄:將目錄dir添加到頭文件搜索范圍添加到頭文件搜索范圍-lmylib:銜接時(shí)搜索庫(kù):銜接時(shí)搜索庫(kù)libmylib.a-Ldir:將目錄:將目錄dir添加到庫(kù)文件搜索范圍添加到庫(kù)文件搜索范圍-OL:編譯時(shí)進(jìn)展優(yōu)化。:編譯時(shí)進(jìn)展優(yōu)化。L為優(yōu)化級(jí)別,分別為優(yōu)化級(jí)別,分別03和和s。生成最終產(chǎn)品。生成最終產(chǎn)品時(shí)運(yùn)用時(shí)運(yùn)用-static:制止運(yùn)用共享庫(kù)動(dòng)態(tài)銜接庫(kù):制止運(yùn)用共享庫(kù)動(dòng)態(tài)銜接庫(kù)-shared:生成共享庫(kù):生成共享庫(kù)-rdynamic:銜接時(shí)運(yùn)用共享庫(kù):銜接時(shí)運(yùn)用共享庫(kù)gcc的常用選項(xiàng)
7、的常用選項(xiàng)gcc常用選項(xiàng)常用選項(xiàng)選項(xiàng)選項(xiàng)含義含義-c僅對(duì)源文件進(jìn)行編譯,不鏈接生成可執(zhí)行文件。在對(duì)源文件進(jìn)行僅對(duì)源文件進(jìn)行編譯,不鏈接生成可執(zhí)行文件。在對(duì)源文件進(jìn)行查錯(cuò)時(shí),或只需產(chǎn)生目標(biāo)文件時(shí)可以使用該選項(xiàng)。查錯(cuò)時(shí),或只需產(chǎn)生目標(biāo)文件時(shí)可以使用該選項(xiàng)。-ggdb在可執(zhí)行文件中加入調(diào)試信息,方便進(jìn)行程序的調(diào)試。如果使用在可執(zhí)行文件中加入調(diào)試信息,方便進(jìn)行程序的調(diào)試。如果使用中括號(hào)中的選項(xiàng),表示加入中括號(hào)中的選項(xiàng),表示加入gdb擴(kuò)展的調(diào)試信息,方便使用擴(kuò)展的調(diào)試信息,方便使用gdb來(lái)來(lái)進(jìn)行調(diào)試進(jìn)行調(diào)試-O0、1、2、3對(duì)生成的代碼使用優(yōu)化,中括號(hào)中的部分為優(yōu)化級(jí)別,缺省的情對(duì)生成的代碼使用優(yōu)化,中
8、括號(hào)中的部分為優(yōu)化級(jí)別,缺省的情況為況為2級(jí)優(yōu)化,級(jí)優(yōu)化,0為不進(jìn)行優(yōu)化。注意,采用更高級(jí)的優(yōu)化并不一為不進(jìn)行優(yōu)化。注意,采用更高級(jí)的優(yōu)化并不一定得到效率更高的代碼。定得到效率更高的代碼。-Dname=definition將名為將名為name的宏定義為的宏定義為definition,如果中括號(hào)中的部分缺省,則,如果中括號(hào)中的部分缺省,則宏被定義為宏被定義為1gccgcc常用選項(xiàng)常用選項(xiàng)選項(xiàng)選項(xiàng)含義含義-I -I dirdir在編譯源程序時(shí)增加一個(gè)搜索頭文件的額外目錄在編譯源程序時(shí)增加一個(gè)搜索頭文件的額外目錄dirdir,即,即includeinclude增加一個(gè)搜索的額外目錄。增加一個(gè)搜索的額
9、外目錄。-L-Ldirdir在編譯源文件時(shí)增加一個(gè)搜索庫(kù)文件的額外目錄在編譯源文件時(shí)增加一個(gè)搜索庫(kù)文件的額外目錄dirdir-l-llibrarylibrary在編譯鏈接文件時(shí)增加一個(gè)額外的庫(kù),庫(kù)名為在編譯鏈接文件時(shí)增加一個(gè)額外的庫(kù),庫(kù)名為librarylibrary.a.a-w-w禁止所有警告禁止所有警告-W-Wwarningwarning允許產(chǎn)生允許產(chǎn)生warningwarning類(lèi)型的警告,類(lèi)型的警告,warningwarning可以是:可以是:mainmain、unusedunused等等很多取值,最常用是很多取值,最常用是-Wall-Wall,表示產(chǎn)生所有警告。如果,表示產(chǎn)生所有警告
10、。如果warningwarning取取值為值為errorerror,其含義是將所有警告作為錯(cuò)誤(,其含義是將所有警告作為錯(cuò)誤(errorerror),即出現(xiàn)警),即出現(xiàn)警告就停止編譯。告就停止編譯。gcc的常用選項(xiàng)的常用選項(xiàng)c+程序程序一個(gè)一個(gè)c+版的版的Hello World程序,其文件名為程序,其文件名為hello.C,內(nèi)容為:,內(nèi)容為:#include main (void)cout Hello, World! endl;編譯方法編譯方法運(yùn)用運(yùn)用c+或或g+來(lái)編譯:來(lái)編譯:g+ hello.C#生成可執(zhí)行程序生成可執(zhí)行程序a.outc+ o hello hell.C #生成可執(zhí)行程序生成
11、可執(zhí)行程序hellog+ s -o Hello hello.C#生成刪除符號(hào)表的可執(zhí)行程序生成刪除符號(hào)表的可執(zhí)行程序Hello 或運(yùn)用或運(yùn)用gcc并指定庫(kù)文件來(lái)編譯并指定庫(kù)文件來(lái)編譯c+程序:程序:gcc c hello.C #生成目的文件生成目的文件hello.ogcc o h hello.C lstdc+ #指定規(guī)范指定規(guī)范c+庫(kù),生成可執(zhí)行程序庫(kù),生成可執(zhí)行程序h編譯多個(gè)文件編譯多個(gè)文件greeting.h #ifndef _GREETING_H #define _GREETING_Hvoid greeting (char * name);#endif greeting.c #inclu
12、de #include greeting.hvoid greeting (char * name)printf(Hello %s!rn,name); my_app.c #include #include greeting.h#define N 10int main(void)char nameN; printf(Your Name,Please:); scanf(%s,name); greeting(name); return 0; 目錄構(gòu)造目錄構(gòu)造(1)(1)編譯命令編譯命令$ gcc my_app.c greeting.c o my_app$ gcc my_app.c greeting.c
13、 o my_app目錄構(gòu)造目錄構(gòu)造(2)(2)編譯方式編譯方式(1)(1)$ $gcc my_app.c functions/greeting.c o my_app -I gcc my_app.c functions/greeting.c o my_app -I function function greeting.h./greeting.cmy_app.cgreeting.h./greeting.cmy_app.cfunctions編譯多個(gè)文件編譯多個(gè)文件目錄構(gòu)造目錄構(gòu)造(2)編譯方式編譯方式(2)分步編譯分步編譯命令:命令:1、$gcc -c my_app.c -Ifunctions 2、
14、$gcc -c functions/greeting.c3、$gcc my_app.o greeting.o o my_app思緒:思緒:編譯每一個(gè)編譯每一個(gè).c文件,得到文件,得到.o的目的文件;的目的文件;將每一個(gè)將每一個(gè).o的目的文件鏈接成一個(gè)可執(zhí)行的文件;的目的文件鏈接成一個(gè)可執(zhí)行的文件;編譯多個(gè)文件編譯多個(gè)文件gcc的任務(wù)過(guò)程的任務(wù)過(guò)程運(yùn)用運(yùn)用gcc/g+由由C源代碼文件生成可執(zhí)行文件的過(guò)程,有以下四個(gè)源代碼文件生成可執(zhí)行文件的過(guò)程,有以下四個(gè)階段階段 預(yù)處置預(yù)處置(也稱(chēng)預(yù)編譯,也稱(chēng)預(yù)編譯,Preprocessing)編譯編譯(Compilation)匯編匯編(Assembly)鏈接
15、鏈接(Linking) 頭文件頭文件 在規(guī)范在規(guī)范C中有兩種方式的頭文件運(yùn)用方式:中有兩種方式的頭文件運(yùn)用方式:#include#include“headfile.h區(qū)別區(qū)別:#include 型頭文件搜索范圍為默許位置型頭文件搜索范圍為默許位置/usr/include,#include“headfile.h型頭文件的搜索位置為當(dāng)前目錄,在型頭文件的搜索位置為當(dāng)前目錄,在Linux的的GNU C中,假設(shè)當(dāng)前目的不存在中,假設(shè)當(dāng)前目的不存在headerfile.h,那么也會(huì)到默許位置,那么也會(huì)到默許位置去搜索。去搜索。 鏈接器與庫(kù)文件鏈接器與庫(kù)文件UNIX/Linux的鏈接器為的鏈接器為ld,其
16、功能是將目的文件或庫(kù)文件鏈接在,其功能是將目的文件或庫(kù)文件鏈接在一同,生成可執(zhí)行文件,普通在編譯過(guò)程的最后執(zhí)行。一同,生成可執(zhí)行文件,普通在編譯過(guò)程的最后執(zhí)行。Linux規(guī)范庫(kù)文件普通存放在目錄規(guī)范庫(kù)文件普通存放在目錄/lib或或/usr/lib。默許情況下鏈接。默許情況下鏈接器查找器查找C言語(yǔ)的規(guī)范庫(kù)函數(shù)。假設(shè)運(yùn)用的不是規(guī)范的庫(kù)函數(shù),必言語(yǔ)的規(guī)范庫(kù)函數(shù)。假設(shè)運(yùn)用的不是規(guī)范的庫(kù)函數(shù),必需經(jīng)過(guò)需經(jīng)過(guò)-llib或或-Llibdir通知鏈接器通知鏈接器ld,否那么將無(wú)法找到庫(kù)函數(shù)。,否那么將無(wú)法找到庫(kù)函數(shù)。 關(guān)于庫(kù)文件的規(guī)定關(guān)于庫(kù)文件的規(guī)定 庫(kù)文件命名必需遵守一定命名規(guī)那么,庫(kù)文件名字必需庫(kù)文件命名
17、必需遵守一定命名規(guī)那么,庫(kù)文件名字必需永遠(yuǎn)以永遠(yuǎn)以lib開(kāi)頭,后緊跟庫(kù)類(lèi)名,文件名的后綴為開(kāi)頭,后緊跟庫(kù)類(lèi)名,文件名的后綴為 .a:傳統(tǒng)靜態(tài)庫(kù):傳統(tǒng)靜態(tài)庫(kù) .so:共享庫(kù)或動(dòng)態(tài)鏈接庫(kù):共享庫(kù)或動(dòng)態(tài)鏈接庫(kù) 例如,例如,libc.a為規(guī)范為規(guī)范C庫(kù),庫(kù),libm.a為數(shù)學(xué)運(yùn)算靜態(tài)庫(kù),為數(shù)學(xué)運(yùn)算靜態(tài)庫(kù),libc.so.6和和libm.so.6分別為規(guī)范分別為規(guī)范C和數(shù)學(xué)運(yùn)算共享庫(kù)。和數(shù)學(xué)運(yùn)算共享庫(kù)。靜態(tài)庫(kù)靜態(tài)庫(kù) 靜態(tài)庫(kù)也叫檔案靜態(tài)庫(kù)也叫檔案(archive),以,以.a為后綴,用于編譯鏈為后綴,用于編譯鏈接后生成靜態(tài)可執(zhí)行文件。用戶可以運(yùn)用庫(kù)管理程序接后生成靜態(tài)可執(zhí)行文件。用戶可以運(yùn)用庫(kù)管理程序ar
18、和和ranlib來(lái)創(chuàng)建和管理本人的或已有的靜態(tài)庫(kù)。來(lái)創(chuàng)建和管理本人的或已有的靜態(tài)庫(kù)。 引例引例設(shè)有設(shè)有C C言語(yǔ)文件言語(yǔ)文件f1.cf1.c,f2.cf2.c,f3.cf3.c,它們的內(nèi)容分別為:,它們的內(nèi)容分別為:/文件文件f1.c的內(nèi)容的內(nèi)容f1(int arg)printf(F1: you passed: %dn,arg);/文件文件f2.c的內(nèi)容:的內(nèi)容:f2(char *arg)printf(F2: you passed: %sn,arg);/文件文件f3.c的內(nèi)容的內(nèi)容#include main() fprintf(stderr,Begine:n); f1(15); f2(Hell
19、o World!); fprintf(stderr,:Endn); exit(0); 程序舉例程序舉例編譯與鏈接編譯與鏈接可以采用各模塊文件分別編譯然后再一致鏈接的方法進(jìn)可以采用各模塊文件分別編譯然后再一致鏈接的方法進(jìn)行編譯。行編譯。cc c f1.c f2.c/生成生成f1.o和和f2.occ o f f3.c f1.o f2.o/生成生成fcc o fp f3.c f1.c f2.c/生成生成fpcc c f1.c f2.c f3.c/生成生成f1.o,f2.o和和f3.occ o myp f1.o f2.o f3.o/生成生成myp構(gòu)造和管理靜態(tài)庫(kù)構(gòu)造和管理靜態(tài)庫(kù) 用戶可以運(yùn)用命令用戶可
20、以運(yùn)用命令ar構(gòu)造本人的靜態(tài)庫(kù):構(gòu)造本人的靜態(tài)庫(kù):cc -c f1.c f2.c#生成目的文件生成目的文件f1.o和和f2.oar crv libmyl.a f1.o f2.o#生成庫(kù)生成庫(kù)libmyl.aranlib libmyl.a#為子函數(shù)建立索為子函數(shù)建立索引表引表闡明闡明ar用于靜態(tài)庫(kù)文件的管理,其功能是庫(kù)創(chuàng)建、修正和從庫(kù)中取出用于靜態(tài)庫(kù)文件的管理,其功能是庫(kù)創(chuàng)建、修正和從庫(kù)中取出模塊等模塊等 ranlib用于為剛建立的庫(kù)文件建立索引表,經(jīng)過(guò)索引表可以加快用于為剛建立的庫(kù)文件建立索引表,經(jīng)過(guò)索引表可以加快庫(kù)文件搜索速度。其用法為:庫(kù)文件搜索速度。其用法為:ranlib -vV ar_
21、file運(yùn)用本人的庫(kù)運(yùn)用本人的庫(kù) #運(yùn)用庫(kù)運(yùn)用庫(kù)libmyl.a和和f3.c生成可執(zhí)行程序生成可執(zhí)行程序fp:cc -o fp f3.c libmyl.a#運(yùn)用庫(kù)運(yùn)用庫(kù)libmyl.a和和f3.o生成可執(zhí)行程序生成可執(zhí)行程序fp:cc -o fp f3.o libmyl.a #-L指定當(dāng)前目錄,指定當(dāng)前目錄,-lmyl指定靜態(tài)庫(kù)文件指定靜態(tài)庫(kù)文件libmyl.a:cc -o fp f3.c -L. lmyl共享庫(kù)共享庫(kù)Linux系統(tǒng)的另一種庫(kù)文件為共享庫(kù),用于生成動(dòng)態(tài)鏈接的可執(zhí)行系統(tǒng)的另一種庫(kù)文件為共享庫(kù),用于生成動(dòng)態(tài)鏈接的可執(zhí)行程序。程序。共享庫(kù)文件名的格式為:共享庫(kù)文件名的格式為: lib
22、NAME.so.NNAME為庫(kù)名,為庫(kù)名,N為版本號(hào)。為版本號(hào)??捎妹羁捎妹頻dd和和ldconfig命令管理共享庫(kù)。命令管理共享庫(kù)。 構(gòu)造共享庫(kù)構(gòu)造共享庫(kù) 共享庫(kù)構(gòu)造非常簡(jiǎn)單,只需求在構(gòu)造庫(kù)的時(shí)候使共享庫(kù)構(gòu)造非常簡(jiǎn)單,只需求在構(gòu)造庫(kù)的時(shí)候使 用用-shared參數(shù)就可以了。參數(shù)就可以了。 例如例如:用用f1.c和和f2.c構(gòu)造共享庫(kù)構(gòu)造共享庫(kù),方法是:方法是: #生成目的文件生成目的文件 cc -c f1.c f2.c #由目的文件生成共享庫(kù)由目的文件生成共享庫(kù) cc -shared -o libmy.so f1.o f2.o #由源文件生成共享庫(kù)由源文件生成共享庫(kù) cc -shared
23、 -o libmy.so -c f1.c f2.c共享庫(kù)的運(yùn)用共享庫(kù)的運(yùn)用 共享庫(kù)要運(yùn)用頭文件共享庫(kù)要運(yùn)用頭文件dlfcn.h和幾個(gè)相關(guān)的函數(shù):和幾個(gè)相關(guān)的函數(shù):dlerrordlopendlsymdlclose。1. dlopen功能:功能:用于翻開(kāi)指定共享庫(kù),并前往文件描畫(huà)符。用于翻開(kāi)指定共享庫(kù),并前往文件描畫(huà)符。原型及用法:原型及用法:void *dlopen(const char *filename, int flag);前往值:前往值:勝利時(shí)前往文件描畫(huà)符,否那么前往勝利時(shí)前往文件描畫(huà)符,否那么前往NULL。dlopen函數(shù)的相關(guān)闡明函數(shù)的相關(guān)闡明變量變量filename為共享庫(kù)名。
24、假設(shè)文件名不以為共享庫(kù)名。假設(shè)文件名不以/開(kāi)頭,那么為非絕對(duì)途開(kāi)頭,那么為非絕對(duì)途徑名,將按以下順序搜索庫(kù)文件:徑名,將按以下順序搜索庫(kù)文件:(1)環(huán)境變量中的環(huán)境變量中的LD_LIBRARY_PATH值指定的途徑;值指定的途徑;(2)動(dòng)態(tài)鏈接緩沖文件動(dòng)態(tài)鏈接緩沖文件/etc/ld.so.cache;(3)庫(kù)文件默許目錄庫(kù)文件默許目錄/lib,/usr/lib。 變量變量flag用來(lái)表示在什么時(shí)候處理未定義的符號(hào),其取值范圍與意用來(lái)表示在什么時(shí)候處理未定義的符號(hào),其取值范圍與意義如下義如下:(1)RTLD_LAZY:指定在動(dòng)態(tài)鏈接庫(kù)的函數(shù)執(zhí)行時(shí)處理;:指定在動(dòng)態(tài)鏈接庫(kù)的函數(shù)執(zhí)行時(shí)處理;(2)R
25、TLD_NOW:指定在:指定在dlopen前往前就處理一切未定義的符號(hào)問(wèn)前往前就處理一切未定義的符號(hào)問(wèn)題。一旦有未處理好未定義的符號(hào),題。一旦有未處理好未定義的符號(hào),dlopen將前往將前往NULL表示錯(cuò)誤表示錯(cuò)誤。留意:留意:RTLD_LAZY和和RTLD_NOW可以與可以與RTLD_GLOBAL配合運(yùn)配合運(yùn)用,使得那些在以后才加載的庫(kù)可以獲得其中的符號(hào)。用,使得那些在以后才加載的庫(kù)可以獲得其中的符號(hào)。2. dlsym功能:前往共享中指定函數(shù)的入口地址功能:前往共享中指定函數(shù)的入口地址原型及用法:原型及用法:void *dlsym(void *handle, char *symbol);闡明
26、:闡明:dlsym根據(jù)共享庫(kù)文件描畫(huà)符根據(jù)共享庫(kù)文件描畫(huà)符(handle)與符號(hào)與符號(hào)(symbol),前往,前往symbol對(duì)應(yīng)的函數(shù)入口地址,相當(dāng)于前往一個(gè)對(duì)應(yīng)的函數(shù)入口地址,相當(dāng)于前往一個(gè)(函數(shù)函數(shù))指針。指針。 3. dlclose功能:功能:封鎖曾經(jīng)翻開(kāi)的指定共享庫(kù)文件,此操作應(yīng)在共享庫(kù)相關(guān)操作完成封鎖曾經(jīng)翻開(kāi)的指定共享庫(kù)文件,此操作應(yīng)在共享庫(kù)相關(guān)操作完成之后進(jìn)展。之后進(jìn)展。原型及用法:原型及用法:int dlclose (void *handle);4. dlerror 功能:功能: 前往動(dòng)態(tài)共享庫(kù)操作形狀信息。當(dāng)共享庫(kù)操作函數(shù)執(zhí)行前往動(dòng)態(tài)共享庫(kù)操作形狀信息。當(dāng)共享庫(kù)操作函數(shù)執(zhí)行失
27、敗時(shí),失敗時(shí),dlerror可以前往出錯(cuò)信息,否那么前往值為可以前往出錯(cuò)信息,否那么前往值為NULL表示勝利。表示勝利。 原型及用法為:原型及用法為: const char *dlerror(void); 共享庫(kù)運(yùn)用例如共享庫(kù)運(yùn)用例如 為了運(yùn)用剛創(chuàng)建的共享庫(kù),需求對(duì)引例中的模塊文件為了運(yùn)用剛創(chuàng)建的共享庫(kù),需求對(duì)引例中的模塊文件f3.c進(jìn)展修正。假定修正后的文件被命名為進(jìn)展修正。假定修正后的文件被命名為f3n.c,其代,其代碼如下:碼如下: #include #include #define SO_FILE ./libmy.somain()void *sfp; char *err;inttmpi
28、=16;int (*f1) (int ),(*f2)(char *); /定義函數(shù)指針定義函數(shù)指針sfp=dlopen(SO_FILE,RTLD_LAZY);/翻開(kāi)共享庫(kù)翻開(kāi)共享庫(kù)if(sfp=NULL) fprintf(stderr,dlerror(); exit(1); f1=dlsym(sfp,f1);/獲取函數(shù)獲取函數(shù)f1入口地址指針入口地址指針err=dlerror();/檢查能否勝利檢查能否勝利if(err) fprintf(stderr,err); exit(2); 共享庫(kù)運(yùn)用例如共享庫(kù)運(yùn)用例如f2=dlsym(sfp,f2); /獲取函數(shù)獲取函數(shù)f2入口地址入口地址err=dl
29、error(); /檢查能否勝利檢查能否勝利if(err) fprintf(stderr,err); exit(3); fprintf(stderr,-begine-n);f2(Test String); /調(diào)用函數(shù)調(diào)用函數(shù)f2f1(tmpi); /調(diào)用函數(shù)調(diào)用函數(shù)f1fprintf(stderr,+end+n);dlclose(sfp); /封鎖共享庫(kù)封鎖共享庫(kù)exit(0); 共享庫(kù)運(yùn)用例如共享庫(kù)運(yùn)用例如編譯方法編譯方法編譯方法為:編譯方法為:cc o myp f3n.c ldl 由共享庫(kù)由共享庫(kù)libmy.so生成可執(zhí)行程序生成可執(zhí)行程序myp,-ldl那么指示鏈接程序那么指示鏈接程序l
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 耳漏鼻漏的護(hù)理
- 紅棗原料采購(gòu)合同范本
- 2025年度一月份跨境生鮮倉(cāng)儲(chǔ)租賃冷鏈追溯系統(tǒng)協(xié)議
- 業(yè)務(wù)團(tuán)隊(duì)管理培訓(xùn)
- 2025【中鐵】員工勞動(dòng)合同
- 2025物業(yè)托管合同樣本
- 門(mén)面轉(zhuǎn)租免責(zé)合同范本
- 2025年份二月份私人生物芯片植入技術(shù)質(zhì)押借款合同
- 廠房養(yǎng)殖蔬菜合同范本
- 追蹤方法學(xué)在護(hù)理質(zhì)量中的應(yīng)用
- 幼兒園《開(kāi)關(guān)門(mén)要小心》
- 29《馬說(shuō)》2022中考語(yǔ)文文言文閱讀復(fù)習(xí)精選真題匯編(原卷版+解析版)
- 基于PLC的自動(dòng)配料系統(tǒng)畢業(yè)設(shè)計(jì)論文
- 國(guó)內(nèi)外鋼結(jié)構(gòu)焊接標(biāo)準(zhǔn)體系及國(guó)標(biāo)鋼結(jié)構(gòu)焊接規(guī)范介紹劉景鳳PPT教案
- 車(chē)站主體結(jié)構(gòu)模板支架專(zhuān)項(xiàng)施工方案--終稿(專(zhuān)家意見(jiàn)修改的)-副本
- 景觀環(huán)境與行為特征
- 煙花爆竹工程設(shè)計(jì)安全規(guī)范
- 小學(xué)美術(shù)國(guó)測(cè)(國(guó)家義務(wù)教育質(zhì)量監(jiān)測(cè))復(fù)習(xí)內(nèi)容
- 110kV升壓站電氣設(shè)備調(diào)試方案
- 四川省中學(xué)生學(xué)籍卡片
評(píng)論
0/150
提交評(píng)論