【摘要】 介紹Linux下靜態(tài)庫(kù)、動(dòng)態(tài)庫(kù)創(chuàng)建方式、完成靜態(tài)庫(kù)、動(dòng)態(tài)庫(kù)調(diào)用,貼出字符串處理、時(shí)間管理兩個(gè)例子代碼。
??查找文件:
[root@wbyq /]# find / -name stdio.h
??文本搜索工具:
# grep -q "12345" /123.c || echo "12345" >> /123.c
??文本修改工具:sed
?? 練習(xí):
1.?制作動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)
2.? (擴(kuò)展) 編寫一個(gè)find功能的程序:可以查找指定目錄下指定的文件。(關(guān)心多層目錄)
3.?編寫一個(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ù)稱為共享庫(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)文件名稱
-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ù)文件的名稱。gcc 123.c -L/work -labc
(實(shí)際上: libabc.so)
??生成動(dòng)態(tài)庫(kù)的指令
gcc -fPIC -shared -o <庫(kù)文件名稱>.so 源文件名稱.c |
庫(kù)文件名稱的命名規(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 :用于編寫程序的編譯規(guī)則。 make命令用于執(zhí)行Makefile文件。
make常用的選項(xiàng)參數(shù):
-n :輸出命令的執(zhí)行過(guò)程,不執(zhí)行名稱
-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];
}
//開始替換
for(n=0;nnew_len)//第三種情況:查找的長(zhǎng)度大于替換的長(zhǎng)度,向前移動(dòng)
{
//計(jì)算向前移動(dòng)的長(zhǎng)度
seek_len=find_len-new_len;
//開始移動(dòng)
for(n=i+find_len-seek_len;n;n++)>;n++)>;i++)>
#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)樵路菔?月份開始,i是從0開始,這里的實(shí)際月份是i+1
day=1; //清空結(jié)構(gòu)體成員--天數(shù),用來(lái)存放新數(shù)據(jù),天數(shù)是從1開始算
/*減去過(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開始算
/*減去過(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開始算
/*減去過(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; //平年
}
-
靜態(tài)庫(kù)
+關(guān)注
關(guān)注
0文章
21瀏覽量
7426 -
Makefile
+關(guān)注
關(guān)注
1文章
125瀏覽量
19181 -
動(dòng)態(tài)庫(kù)
+關(guān)注
關(guān)注
0文章
17瀏覽量
6222
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論