成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

《電話號碼管理系統(tǒng)》制作成靜態(tài)庫和動態(tài)庫

開發(fā) 后端
本文,一口君將繼續(xù)以之前的 電話號碼管理系統(tǒng)的項目為基礎,給大家詳細講解如何將該項目中的函數(shù)制作成動態(tài)庫和靜態(tài)庫。

[[438801]]

一、前言

上次寫了一篇關于Makefile的文章。

《利用Makfile給多文件、多目錄C源碼建立工程》

有很多粉絲留言,有的粉絲想進一步了解cmake的使用方法,還有的粉絲想知道如何將一些函數(shù)編譯成動態(tài)庫或者靜態(tài)庫,然后再將該庫編譯到內(nèi)存中。

一口君必須安排,本篇先講如何將一些函數(shù)編譯成動態(tài)庫或者靜態(tài)庫。

這就涉及到一個庫的概念,關于制作的庫的基礎知識,一口君已經(jīng)在下面這篇文章中詳細的講述了相關概念,建議大家先看下面這篇文章。

《Linux庫概念,動態(tài)庫和靜態(tài)庫概念》

本文,一口君將繼續(xù)以之前的 電話號碼管理系統(tǒng)的項目為基礎,給大家詳細講解如何將該項目中的函數(shù)制作成動態(tài)庫和靜態(tài)庫。

《從0寫一個《電話號碼管理系統(tǒng)》的C入門項目》

二、 基礎知識

1) 靜態(tài)庫

所謂靜態(tài)庫,就是在靜態(tài)編譯時由編譯器到指定目錄尋找并且進行鏈接,一旦鏈接完成,最終的可執(zhí)行程序中就包含了該庫文件中的所有有用信息,包括代碼段、數(shù)據(jù)段等。

2)動態(tài)庫

所謂動態(tài)庫,就是在應用程序運行時,由操作系統(tǒng)根據(jù)應用程序的請求,動態(tài)到指定目錄下尋找并裝載入內(nèi)存中,同時需要進行地址重定向。

3)庫文件命名

靜態(tài)庫的名字一般為libxxxx.a,其中xxxx是該lib的名稱;動態(tài)庫的名字一般為libxxxx.so.x.y.z,含義如下圖所示:

4)制作庫文件常用參數(shù)

首先需要了解gcc編譯庫要用到一些參數(shù),很重要。

三、 制作靜態(tài)庫

原始文件目錄如下:

  1. peng@ubuntu:/mnt/hgfs/code/phone3$ tree . 
  2. ├── main.c 
  3. ├── phone.c 
  4. └── phone.h 
  5.  
  6. 0 directories, 3 files 

其中 phone.c包含了對鏈表的所有的操作函數(shù) phone.h 是phone.c中所有函數(shù)的原型說明 main.c是主程序

下面我們將phone.c制作成靜態(tài)庫。

1. 把 listd.c 編譯成.o文件

  1. peng@ubuntu:/mnt/hgfs/code/phone3$ gcc -c phone.c 

2. 使用 ar 命令生成靜態(tài)庫libadd.a

靜態(tài)庫名字遵循靜態(tài)庫命名的規(guī)則 lib + 名字 + .a

  1. peng@ubuntu:/mnt/hgfs/code/phone3$ ar -rc libphone.a phone.o  

3. 將庫和頭文件拷貝到其他目錄下

將庫文件移動到lib目錄下

  1. peng@ubuntu:/mnt/hgfs/code/phone3$ mkdir lib 
  2. peng@ubuntu:/mnt/hgfs/code/phone3$ mv libphone.a lib 

移動頭文件到include目錄下

  1. peng@ubuntu:/mnt/hgfs/code/phone3$ mkdir include 
  2. peng@ubuntu:/mnt/hgfs/code/phone3$ mv phone.h include/ 

刪除phone.c

  1. peng@ubuntu:/mnt/hgfs/code/phone3$ rm phone.c 

此處可不刪除,下面的的編譯已經(jīng)用不到該文件 刪除僅僅是為了排除干擾,有些同學會以為這個文件還會被編譯進去

最終文件結(jié)構(gòu)如下:

  1. peng@ubuntu:/mnt/hgfs/code/phone3$ tree ./ 
  2. ./ 
  3. ├── include 
  4. │   └── phone.h 
  5. ├── lib 
  6. │   └── libphone.a 
  7. ├── main.c 
  8. └── run 
  9.  
  10. 2 directories, 6 files 

lib include 目錄也可以是其他目錄,實際項目中庫文件和頭文件都會放到一些指定目錄下

4.編譯

值編譯main.c,會有以下錯誤提示,主要是因為phone.h

  1. peng@ubuntu:/mnt/hgfs/code/phone3$ gcc main.c  
  2. main.c:3:19: 致命錯誤:phone.h:沒有那個文件或目錄 
  3. 編譯中斷。 

制定頭文件位置,編譯結(jié)果如下,可以看到錯誤提示,“沒有定義create”,這是因為在鏈接的時候找打不到這些函數(shù)的定義的地方

  1. peng@ubuntu:/mnt/hgfs/code/phone3$ gcc main.c -I ./include 
  2. /tmp/cctUUKm9.o: In function `management': 
  3. main.c:(.text+0x109): undefined reference to `create
  4. main.c:(.text+0x120): undefined reference to `delete
  5. main.c:(.text+0x137): undefined reference to `search' 
  6. main.c:(.text+0x14e): undefined reference to `display' 
  7. main.c:(.text+0x167): undefined reference to `allfree' 
  8. /tmp/cctUUKm9.o: In function `main': 
  9. main.c:(.text+0x2e3): undefined reference to `init' 
  10. collect2: ld 返回 1 

最終我們執(zhí)行

  1. peng@ubuntu:/mnt/hgfs/code/phone3$ gcc main.c -I ./include ./lib/libphone.a  

指定了頭文件和庫文件位置,執(zhí)行結(jié)果如下:

與之前運行現(xiàn)象是一樣的。

可見,使用庫的時候我們必須制定頭文件目錄以及庫目錄。

四、 制作動態(tài)庫原始文件

  1. peng@ubuntu:/mnt/hgfs/code/phone3$ tree . 
  2. ├── main.c 
  3. ├── phone.c 
  4. └── phone.h 
  5.  
  6. 0 directories, 3 files 

1. 把phone.c編譯成動態(tài)鏈接庫libphone.so

  1. gcc -fPIC -o libphone.o -c phone.c 
  2. gcc -shared -o libphone.so libphone.o 

也可以直接使用一條命令

  1. gcc -fPIC -shared -o libphone.so phone.c 

2. 動態(tài)庫的安裝

通常動態(tài)庫拷貝到/lib下:

  1. peng@ubuntu:/mnt/hgfs/code/phone4$ sudo mv libphone.so /lib/ 
  2. [sudo] password for peng:  

刪除phone.c

  1. peng@ubuntu:/mnt/hgfs/code/phone3$ rm phone.c 

3. 編譯執(zhí)行

編譯動態(tài)庫:

  1. peng@ubuntu:/mnt/hgfs/code/phone4$ gcc main.c -lphone -o run 

此時使用我們制作的動態(tài)庫,只需要加上 -lphone即可

  1. 注意觀察編譯時動態(tài)庫的名字與庫文件對應關系 
  2.  
  3. libphone.so<--------->-lphone  

執(zhí)行結(jié)果如下:

五、重新建立工程

下面我們將文件重新放置

當前文件目錄如下:

  1. ./include 
  2. └── phone.h 
  3. ./Makefile  
  4. ./obj 
  5. └── Makefile 
  6. ./src 
  7. ├── main.c 
  8. └── Makefile 
  9.  
  10. 0 directories, 5 files 

并添加3個Makefile

編譯步驟如下:

聲明環(huán)境變量

  1. CC       編譯名稱 
  2. LIBS     用到的動態(tài)庫 
  3. SUBDIRS  子目錄 
  4. OBJS     src下所有的目標文件 
  5. BIN      最終生成的可執(zhí)行程序名字 
  6. OBJS_DIR 目標文件存放目錄 
  7. BIN_DIR  可執(zhí)行程序存儲目錄 

執(zhí)行make的默認目標all,依賴CHECK_DIR $(SUBDIRS)

執(zhí)行目標CHECK_DIR ,創(chuàng)建目錄bin

執(zhí)行目標@ ,進入子目錄src、obj執(zhí)行子目錄的Makefile,

打印語句 echo begin compile phone!

進入子目錄src執(zhí)行Makfile,

執(zhí)行命令

  1. @$(CC) -c main.c -I../include -o ../$(OBJS_DIR)/main.o   
  1. @ :打印該條命令 
  2. -I../include 頭文件在上一級目錄下的include中 
  3. -o ../$(OBJS_DIR)/main.o 生成的目標文件存放在../obj/main.o 

進入子目錄obj執(zhí)行Makfile, 目標為../bin/phone:main.o 執(zhí)行命令

  1. @$(CC) -o $@ $^  $(LIBS) 
  1. @$(CC) 同上 
  2. $@ 表示生成的目標文件,即../bin/phone 
  3. $^ 表示所有的依賴文件,即上面:后面目標文件main.o 

編譯完成后就會在bin目錄下創(chuàng)建可執(zhí)行程序文件phone, 運行結(jié)果如下:

本文轉(zhuǎn)載自微信公眾號「一口Linux」

 

責任編輯:姜華 來源: 一口Linux
相關推薦

2011-06-09 11:11:35

QT 靜態(tài)庫 動態(tài)庫

2021-12-29 08:40:41

LeetCode字符串算法

2020-10-29 09:56:23

Linux靜態(tài)庫動態(tài)庫

2013-04-08 10:27:59

iOSXcode制作靜態(tài)庫

2010-03-04 10:17:57

Linux動態(tài)庫

2009-06-26 10:15:27

Google語音服務

2017-01-10 13:42:18

大數(shù)據(jù)深度學習識別圖片

2011-07-22 16:15:11

IOS 靜態(tài)類

2021-09-06 11:51:26

項目C語言開發(fā)

2015-05-13 09:57:14

C++靜態(tài)庫與動態(tài)庫

2010-03-04 09:51:07

Linux動態(tài)庫

2022-03-24 23:04:37

linux靜態(tài)庫動態(tài)庫

2013-04-10 18:12:57

2021-07-12 11:15:20

黑客數(shù)據(jù)泄露網(wǎng)絡攻擊

2020-03-11 08:52:17

Session開源通信應用

2019-11-26 09:00:29

動態(tài)庫靜態(tài)庫運行時庫

2021-09-17 05:42:13

微信一證通查騰訊

2015-08-19 09:21:19

國際電話區(qū)號代碼實踐

2024-02-28 08:10:15

Linux靜態(tài)庫動態(tài)庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: а天堂中文最新一区二区三区 | 久久成人免费 | 久久毛片 | 在线三级网址 | 免费在线看黄视频 | 一区二区在线不卡 | 欧美激情啪啪 | 亚洲成人999 | 91天堂| 99视频精品 | 成人国产在线视频 | 欧美精品一区二区三区在线播放 | 欧美一区二区三区久久精品视 | 99精品在线| 日韩福利电影 | 日韩久久久久 | 天天弄| 99久久电影| 一区免费看 | 国产一区二 | 国产精品久久久久久久久久久久 | 天天躁日日躁xxxxaaaa | 中文字幕欧美一区 | 国产高清美女一级a毛片久久w | 国产成人免费 | 黄色毛片免费 | 成人免费在线电影 | 色偷偷人人澡人人爽人人模 | 亚洲精品在线观看网站 | 99国产精品久久久久老师 | 99精品国产在热久久 | 在线免费观看视频你懂的 | 国产精品一二三区在线观看 | 久久久久一区二区三区 | 91视频国产区| 成人在线免费视频 | 中文字幕日韩欧美一区二区三区 | 久久久国产视频 | 精品视频亚洲 | 日本高清不卡视频 | 中文字幕在线观看www |