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

《電話號碼管理系統》制作成靜態庫和動態庫

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

[[438801]]

一、前言

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

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

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

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

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

《Linux庫概念,動態庫和靜態庫概念》

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

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

二、 基礎知識

1) 靜態庫

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

2)動態庫

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

3)庫文件命名

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

4)制作庫文件常用參數

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

三、 制作靜態庫

原始文件目錄如下:

  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包含了對鏈表的所有的操作函數 phone.h 是phone.c中所有函數的原型說明 main.c是主程序

下面我們將phone.c制作成靜態庫。

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

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

2. 使用 ar 命令生成靜態庫libadd.a

靜態庫名字遵循靜態庫命名的規則 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 

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

最終文件結構如下:

  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. 編譯中斷。 

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

  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 

最終我們執行

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

指定了頭文件和庫文件位置,執行結果如下:

與之前運行現象是一樣的。

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

四、 制作動態庫原始文件

  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編譯成動態鏈接庫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. 動態庫的安裝

通常動態庫拷貝到/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. 編譯執行

編譯動態庫:

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

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

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

執行結果如下:

五、重新建立工程

下面我們將文件重新放置

當前文件目錄如下:

  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

編譯步驟如下:

聲明環境變量

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

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

執行目標CHECK_DIR ,創建目錄bin

執行目標@ ,進入子目錄src、obj執行子目錄的Makefile,

打印語句 echo begin compile phone!

進入子目錄src執行Makfile,

執行命令

  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執行Makfile, 目標為../bin/phone:main.o 執行命令

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

編譯完成后就會在bin目錄下創建可執行程序文件phone, 運行結果如下:

本文轉載自微信公眾號「一口Linux」

 

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

2011-06-09 11:11:35

QT 靜態庫 動態庫

2021-12-29 08:40:41

LeetCode字符串算法

2020-10-29 09:56:23

Linux靜態庫動態庫

2013-04-08 10:27:59

iOSXcode制作靜態庫

2010-03-04 10:17:57

Linux動態庫

2009-06-26 10:15:27

Google語音服務

2017-01-10 13:42:18

大數據深度學習識別圖片

2021-09-06 11:51:26

項目C語言開發

2011-07-22 16:15:11

IOS 靜態類

2015-05-13 09:57:14

C++靜態庫與動態庫

2010-03-04 09:51:07

Linux動態庫

2022-03-24 23:04:37

linux靜態庫動態庫

2020-03-11 08:52:17

Session開源通信應用

2013-04-10 18:12:57

2021-07-12 11:15:20

黑客數據泄露網絡攻擊

2019-11-26 09:00:29

動態庫靜態庫運行時庫

2021-09-17 05:42:13

微信一證通查騰訊

2015-08-19 09:21:19

國際電話區號代碼實踐

2021-04-22 06:15:59

Linux靜態鏈接動態庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区四区在线 | 97人人草| 精品日韩一区二区 | 岛国午夜 | 国产精品一区在线 | 成人在线免费视频观看 | 电影在线 | 国产成年人小视频 | 亚欧精品 | 午夜视频在线免费观看 | 日韩精品一区二区不卡 | 91精品一区 | 国产麻豆一区二区三区 | 欧美成人精品一区二区三区 | 国产高潮好爽受不了了夜夜做 | 国产亚洲精品区 | 久久精品一级 | 日韩视频精品在线 | 一级毛片视频 | 国产粉嫩尤物极品99综合精品 | 色就是色欧美 | 欧美精品一区在线发布 | 欧美日韩国产精品一区 | 在线日韩 | 亚州av在线| 欧美三区| 日韩电影在线一区 | 久久精品99久久 | 91免费在线看 | 国产精品电影在线观看 | 色噜噜亚洲男人的天堂 | 亚洲综合大片69999 | 一级a爱片性色毛片免费 | 欧美在线a | 中文字幕一区二区三区在线观看 | 在线色网址 | 在线观看av网站永久 | 欧美大片在线观看 | jizz18国产| 亚洲一区二区三区在线播放 | 免费在线观看毛片 |