Linux開(kāi)發(fā)_動(dòng)態(tài)靜態(tài)庫(kù)創(chuàng)建與Makefile規(guī)則

      網(wǎng)友投稿 695 2025-04-02

      ? ?查找文件:


      [root@wbyq /]# find / -name stdio.h

      ? ?文本搜索工具:

      # grep -q "12345" /123.c || echo "12345" >> /123.c

      ? ?文本修改工具:sed

      Linux開(kāi)發(fā)_動(dòng)態(tài)靜態(tài)庫(kù)創(chuàng)建與Makefile規(guī)則

      ? 練習(xí):

      1. ?制作動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)

      2. ? (擴(kuò)展) 編寫(xiě)一個(gè)find功能的程序:可以查找指定目錄下指定的文件。(關(guān)心多層目錄)

      3. ?編寫(xiě)一個(gè)文本修改程序:可以修改指定文件中的內(nèi)容。

      (1) ?將指定一行的內(nèi)容全部替換為空格

      (2) ?將指定一個(gè)字符串替換為傳入指定的字符串。 ./a.out /123.c 888 666

      ? ?安裝軟件的命令:

      [root@wbyq Packages]# rpm -ivh tree-1.5.3-2.el6.i686.rpm

      任務(wù)1:靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)

      [root@wbyq test]# arm-linux-gcc 123.c -o app_1

      [root@wbyq test]# arm-linux-gcc -static 123.c -o app_2

      Linux下庫(kù)文件存放的位置: /lib (存放的是動(dòng)態(tài)庫(kù))

      .so屬于動(dòng)態(tài)庫(kù), .a屬于靜態(tài)庫(kù)

      動(dòng)態(tài)庫(kù)稱(chēng)為共享庫(kù):gcc 123.c -o app

      共享庫(kù):程序在運(yùn)行的時(shí)候去調(diào)用函數(shù)(載入函數(shù))。

      靜態(tài)庫(kù):相關(guān)的函數(shù)在編譯的時(shí)候就已經(jīng)拷貝到目標(biāo)中。

      [root@wbyq test]# file app_1

      app_1: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.27, not stripped

      [root@wbyq test]# file app_2

      app_2: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.27, not stripped

      [root@wbyq test]# gcc 123.c -o app_3

      [root@wbyq test]# file app_3

      app_3: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

      ? ?GCC編譯器的選項(xiàng)參數(shù)

      -o :指定生成的目標(biāo)文件名稱(chēng)

      -c :指定生成.o文件(編譯好的二進(jìn)制文件)。

      -g :在生成的目標(biāo)文件中加入調(diào)試參數(shù)。適用于GDB調(diào)試。

      -I :指定頭文件的路徑 。 gcc 123.c -I/work

      -L :指定庫(kù)文件的路徑。gcc 123.c -L/work

      -l :指定庫(kù)文件的名稱(chēng)。gcc 123.c -L/work -labc

      (實(shí)際上: libabc.so)

      ? ?生成動(dòng)態(tài)庫(kù)的指令

      gcc -fPIC -shared -o <庫(kù)文件名稱(chēng)>.so 源文件名稱(chēng).c

      庫(kù)文件名稱(chēng)的命名規(guī)則: libxxx.so

      調(diào)用動(dòng)態(tài)庫(kù)出現(xiàn)的錯(cuò)誤:

      [root@wbyq test]# ./a.out

      ./a.out: error while loading shared libraries: libsum.so: cannot open shared object file: No such file or directory

      1. ?將xxx.so直接放到/lib目錄下。

      2. ?設(shè)置環(huán)境變量:LD_LIBRARY_PATH (存放系統(tǒng)庫(kù)文件的搜索路徑)

      ? ?生成靜態(tài)庫(kù)。 xxx.a

      如果在相同的目錄下有靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù),優(yōu)先使用動(dòng)態(tài)庫(kù)

      # ar crv libsum.a sum.o

      任務(wù)2:Makefile

      Makefile :用于編寫(xiě)程序的編譯規(guī)則。 make命令用于執(zhí)行Makefile文件。

      make常用的選項(xiàng)參數(shù):

      -n :輸出命令的執(zhí)行過(guò)程,不執(zhí)行名稱(chēng)

      -s :隱藏命令本身。 在命令前面加上@符號(hào),可以隱藏命令本身。

      $(shell pwd)

      CC :特殊變量,用于存放編譯器。

      ? 練習(xí):

      1. ?Makefile自動(dòng)化編譯

      只是創(chuàng)建3個(gè)目錄,每個(gè)目錄下各有一個(gè).c一個(gè).h,一個(gè)Makefile文件

      在頂層目錄下創(chuàng)建一個(gè)Makefile文件,,實(shí)現(xiàn)自動(dòng)化編譯。

      2. ?Makefile自動(dòng)化編譯

      只是創(chuàng)建3個(gè)目錄,每個(gè)目錄下各有一個(gè).c一個(gè).h

      在頂層目錄下創(chuàng)建一個(gè)Makefile文件,實(shí)現(xiàn)自動(dòng)化編譯。

      查找字符串并替換為其他字符串:

      ?查找字符串并替換為其他字符串。 比如: “123dfjdfv123” 將123替換為888 結(jié)果: “888dfjdfv888” “123dfjdfv123” 將123替換為8888 結(jié)果: “8888dfjdfv8888” “123dfjdfv123” 將123替換為88 結(jié)果: “88dfjdfv88” #include int main() { char src_str[100]; //源字符串 char new_str[50]; //替換后的字符串 char find_str[50]; //查找的字符串 int src_len=0,new_len=0,find_len=0; //存放字符串的長(zhǎng)度 int i,j,n; int seek_len=0; //記錄移動(dòng)的長(zhǎng)度 /*1. 錄入字符串*/ printf("輸入源字符串:"); scanf("%s",src_str); printf("輸入查找的字符串:"); scanf("%s",find_str); printf("輸入替換后的字符串:"); scanf("%s",new_str); /*2. 計(jì)算字符串的長(zhǎng)度*/ while(src_str[src_len]!='\0') { src_len++; } while(find_str[find_len]!='\0') { find_len++; } while(new_str[new_len]!='\0') { new_len++; } /*3. 查找字符串*/ for(i=0;i=i+find_len;n--) { src_str[n+seek_len]=src_str[n]; } //開(kāi)始替換 for(n=0;nnew_len)//第三種情況:查找的長(zhǎng)度大于替換的長(zhǎng)度,向前移動(dòng) { //計(jì)算向前移動(dòng)的長(zhǎng)度 seek_len=find_len-new_len; //開(kāi)始移動(dòng) for(n=i+find_len-seek_len;n

      模擬電子時(shí)鐘

      #include #include int year=0,month=0,day=0,hour=0,minute=0,sec=0,week=0; void Get_RTC_Timer(int RTC_CNT); void GET_Week(int sec_cnt); int Get_year(int year); int main() { while(1) { int data=time(NULL); Get_RTC_Timer(data); printf("當(dāng)前時(shí)間為: %d年%d月%d日 %d時(shí)%d分%d秒 星期%d\n",year,month,day,hour,minute,sec,week); sleep(1); } return 0; } const char month_r[12]={31,29,31,30,31,30,31,31,30,31,30,31}; //閏年月份表 const char month_p[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //平年月份表 /* 將秒為單位的時(shí)間轉(zhuǎn)換為:年月日時(shí)分秒 */ void Get_RTC_Timer(int RTC_CNT) { int i=0; int year_n=1970; //基準(zhǔn)年份 GET_Week(RTC_CNT); //獲取星期 /*根據(jù)基準(zhǔn)年份,減去過(guò)去年份*/ while(RTC_CNT>=31536000) //31536000是平年的秒數(shù), 31622400是閏年的秒數(shù) { if(Get_year(year_n)) //閏年 { if(RTC_CNT>=31622400) { RTC_CNT-=31622400; //減去閏年一年的秒數(shù) } else { break; //退出循環(huán) } } else { RTC_CNT-=31536000; //減去平年一年的秒數(shù) } year_n++; //年份累加 } year=year_n; //年份 /*減去過(guò)去的月份*/ if(Get_year(year_n)) //減去閏年的月份 { while(RTC_CNT>=month_r[i]*86400) //29*24*60*60 { RTC_CNT-=month_r[i]*86400; //減去過(guò)去的月份 i++; //累加每一個(gè)月的秒數(shù) } } else //減去平年的月份 { while(RTC_CNT>=month_p[i]*86400) //86400=24*60*60 { RTC_CNT-=month_p[i]*86400; //減去過(guò)去的月份 i++; //累加每一個(gè)月的秒數(shù) } } month=i+1; //因?yàn)樵路菔?月份開(kāi)始,i是從0開(kāi)始,這里的實(shí)際月份是i+1 day=1; //清空結(jié)構(gòu)體成員--天數(shù),用來(lái)存放新數(shù)據(jù),天數(shù)是從1開(kāi)始算 /*減去過(guò)去的天數(shù)*/ while(RTC_CNT>=86400) //86400=24*60*60 一天的秒數(shù) { RTC_CNT-=86400; //減去一天的秒 day++; //天自增 } hour=0; //清空結(jié)構(gòu)體成員--小時(shí)數(shù),用來(lái)存放新數(shù)據(jù),小時(shí)數(shù)是從0開(kāi)始算 /*減去過(guò)去的小時(shí)*/ while(RTC_CNT>=3600) //3600=60*60 { RTC_CNT-=3600; //減去一小時(shí)的秒 hour++; //小時(shí)自增 } hour+=8; //時(shí)區(qū)相差8 minute=0;//清空結(jié)構(gòu)體成員--分鐘數(shù),用來(lái)存放新數(shù)據(jù),分鐘數(shù)是從0開(kāi)始算 /*減去過(guò)去的分鐘*/ while(RTC_CNT>=60) { RTC_CNT-=60; minute++; } sec=RTC_CNT; //秒賦值,減到最后,剩下就是秒數(shù) } /* 獲取星期 */ void GET_Week(int sec_cnt) { int day_cnt=0;//天數(shù) day_cnt=sec_cnt/86400; //得到總天數(shù) switch(day_cnt%7) { case 0:week=4;break; case 1:week=5;break; case 2:week=6;break; case 3:week=7;break; case 4:week=1;break; case 5:week=2;break; case 6:week=3;break; } } /* 判斷閏年 閏年返回1 平年返回0 */ int Get_year(int year) { if((year%400==0)||((year%4==0)&&(year%100!=0)))//判斷閏年的條件 { return 1; //閏年 } return 0; //平年 }

      Linux Makefile

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:多人辦公表格軟件(多人在線辦公表格
      下一篇:js 模塊化基礎(chǔ)和模塊規(guī)范AMD、CMD、ES6模塊
      相關(guān)文章
      亚洲AV一区二区三区四区| 亚洲国产成人九九综合| 亚洲乱人伦中文字幕无码| 久久亚洲精品中文字幕| 婷婷亚洲久悠悠色悠在线播放| 亚洲国产婷婷六月丁香| 亚洲精品无码久久一线| 国产精品亚洲成在人线| 亚洲乱亚洲乱妇无码麻豆| 亚洲乱亚洲乱妇无码麻豆| 亚洲阿v天堂在线| 国产亚洲精品资源在线26u| 亚洲欧洲成人精品香蕉网| 亚洲av无码乱码国产精品 | 亚洲国产AV无码专区亚洲AV| 国产亚洲精AA在线观看SEE| 国产亚洲精品a在线观看app| 亚洲成AV人片在| 亚洲AV乱码久久精品蜜桃| 亚洲四虎永久在线播放| 亚洲成综合人影院在院播放| 亚洲AV成人无码天堂| 亚洲免费观看网站| 亚洲三级在线观看| 亚洲欧美国产日韩av野草社区| 大桥未久亚洲无av码在线 | 亚洲成?v人片天堂网无码| 亚洲伊人久久综合影院| 亚洲最大AV网站在线观看| 亚洲AV无码一区二区三区DV| 亚洲综合国产精品| 亚洲啪啪免费视频| 亚洲一本到无码av中文字幕| MM1313亚洲精品无码久久| 亚洲男人的天堂一区二区| 亚洲精品tv久久久久久久久 | 亚洲国产av玩弄放荡人妇| 亚洲不卡无码av中文字幕| 亚洲人成网站在线观看播放| 老汉色老汉首页a亚洲| 亚洲三级视频在线|