RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

DS小龍哥-嵌入式技術(shù) ? 2022-09-17 15:41 ? 次閱讀

【摘要】 介紹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++)>

模擬電子時(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)樵路菔?月份開始,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;    //平年
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 靜態(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)注

    0

    文章

    17

    瀏覽量

    6222
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    深入探討Linux系統(tǒng)中的動(dòng)態(tài)鏈接庫(kù)機(jī)制

    本文將深入探討Linux系統(tǒng)中的動(dòng)態(tài)鏈接庫(kù)機(jī)制,這其中包括但不限于全局符號(hào)介入、延遲綁定以及地址無(wú)關(guān)代碼等內(nèi)容。 引言 在軟件開發(fā)過(guò)程中,動(dòng)態(tài)
    的頭像 發(fā)表于 12-18 10:06 ?71次閱讀
    深入探討<b class='flag-5'>Linux</b>系統(tǒng)中的<b class='flag-5'>動(dòng)態(tài)</b>鏈接<b class='flag-5'>庫(kù)</b>機(jī)制

    Linux 驅(qū)動(dòng)開發(fā)與應(yīng)用開發(fā),你知道多少?

    一、Linux驅(qū)動(dòng)開發(fā)與應(yīng)用開發(fā)的區(qū)別開發(fā)層次不同:Linux驅(qū)動(dòng)開發(fā)主要是針對(duì)硬件設(shè)備進(jìn)行編程
    的頭像 發(fā)表于 08-30 12:16 ?746次閱讀
    <b class='flag-5'>Linux</b> 驅(qū)動(dòng)<b class='flag-5'>開發(fā)</b>與應(yīng)用<b class='flag-5'>開發(fā)</b>,你知道多少?

    嵌入式學(xué)習(xí)-靜態(tài)鏈接和動(dòng)態(tài)鏈接

    需要加上-static參數(shù)。 二、動(dòng)態(tài)鏈接動(dòng)態(tài)鏈接使用動(dòng)態(tài)鏈接庫(kù)進(jìn)行鏈接,生成的程序在執(zhí)行的時(shí)候需要加載所需要的動(dòng)態(tài)
    發(fā)表于 08-28 09:33

    靜態(tài)鏈接和動(dòng)態(tài)鏈接

    需要加上-static參數(shù)。 二、動(dòng)態(tài)鏈接動(dòng)態(tài)鏈接使用動(dòng)態(tài)鏈接庫(kù)進(jìn)行鏈接,生成的程序在執(zhí)行的時(shí)候需要加載所需要的動(dòng)態(tài)
    發(fā)表于 08-27 10:20

    關(guān)于Makefile自動(dòng)生成-autotools的使用

    Linux應(yīng)用開發(fā)中,編寫Makefile是一項(xiàng)必備技能,因?yàn)樗x了工程中所有文件的編譯順序、規(guī)則和依賴關(guān)系,決定了哪些文件需要編譯以及它們的編譯順序。 雖然對(duì)初級(jí)
    的頭像 發(fā)表于 07-25 15:50 ?1497次閱讀
    關(guān)于<b class='flag-5'>Makefile</b>自動(dòng)生成-autotools的使用

    如何在IDF框架中使用自定義的靜態(tài)庫(kù)動(dòng)態(tài)庫(kù)

    基于商業(yè)需要,我們需要在 ESP-IDF v4.0-rc 這個(gè)版本的IDF中開發(fā)與使用自定義庫(kù),有如下問(wèn)題請(qǐng)協(xié)助: 1如何利用IDF框架編寫自定義靜態(tài)庫(kù)
    發(fā)表于 06-25 07:57

    linux系統(tǒng)中Makefile的使用方法

    Makefile是一種編譯控制文件,廣泛用于項(xiàng)目的自動(dòng)化構(gòu)建。它定義了一系列的規(guī)則來(lái)指導(dǎo)構(gòu)建的過(guò)程。通過(guò)Makefile,開發(fā)者可以輕松管理大型項(xiàng)目的編譯鏈接、清理等任務(wù)。本文將從
    的頭像 發(fā)表于 05-11 08:49 ?649次閱讀

    C語(yǔ)言Makefile入門到精通全攻略

    Makefile是一種編譯控制文件,廣泛用于項(xiàng)目的自動(dòng)化構(gòu)建。它定義了一系列的規(guī)則來(lái)指導(dǎo)構(gòu)建的過(guò)程。
    發(fā)表于 04-28 15:02 ?1324次閱讀

    Linux添加磁盤創(chuàng)建分區(qū)、掛載

    Linux添加磁盤創(chuàng)建分區(qū)、掛載
    發(fā)表于 04-20 17:49 ?498次閱讀
    <b class='flag-5'>Linux</b>添加磁盤<b class='flag-5'>創(chuàng)建</b>分區(qū)、掛載

    淺析CMOS電路的靜態(tài)功耗和動(dòng)態(tài)功耗

    CMOS電路功耗主要由動(dòng)態(tài)功耗和靜態(tài)功耗組成,動(dòng)態(tài)功耗又分為開關(guān)功耗、短路功耗兩部分
    的頭像 發(fā)表于 04-01 16:16 ?5912次閱讀
    淺析CMOS電路的<b class='flag-5'>靜態(tài)</b>功耗和<b class='flag-5'>動(dòng)態(tài)</b>功耗

    cubeide創(chuàng)建靜態(tài)庫(kù)工程,如何使用cubeMX生成配置代碼?

    創(chuàng)建工程可執(zhí)行程序的話會(huì)生成一個(gè).ioc文件,然后可以使用MX配置生成代碼, 但創(chuàng)建靜態(tài)庫(kù)工程的話并沒(méi)有生成.ioc文件,請(qǐng)教一下如何使用。 感謝?。。。。。。。。?!
    發(fā)表于 03-12 08:04

    Visual Develop開發(fā)STM8S207MBT6時(shí)需要提供一個(gè)靜態(tài)庫(kù),如何實(shí)現(xiàn)?

    我在使用ST Visual Develop開發(fā)STM8S207MBT6時(shí)需要提供一個(gè)靜態(tài)庫(kù)(例如MDK中創(chuàng)建的.lib庫(kù)文件)給客戶調(diào)取接口
    發(fā)表于 03-12 07:54

    什么是傳感器的靜態(tài)特性和動(dòng)態(tài)特性?

    傳感器的靜態(tài)特性和動(dòng)態(tài)特性是衡量傳感器性能的重要參數(shù),下面將詳細(xì)介紹這兩者的定義和特點(diǎn)。
    的頭像 發(fā)表于 01-30 13:52 ?5109次閱讀

    Makefile可以做什么?Makefile的基本格式

    Makefile可以根據(jù)指定的依賴規(guī)則和文件是否有修改來(lái)執(zhí)行命令。常用來(lái)編譯軟件源代碼,只需要重新編譯修改過(guò)的文件,使得編譯速度大大加快。
    的頭像 發(fā)表于 01-25 11:18 ?697次閱讀

    全面而詳細(xì)的Makefile使用手冊(cè)

    Makefile是一種編譯控制文件,廣泛用于項(xiàng)目的自動(dòng)化構(gòu)建。它定義了一系列的規(guī)則來(lái)指導(dǎo)構(gòu)建的過(guò)程。
    的頭像 發(fā)表于 01-24 12:35 ?912次閱讀
    RM新时代网站-首页