日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux分文件编程、静态库与动态库

發布時間:2023/12/10 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux分文件编程、静态库与动态库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考:linux靜態庫與動態庫編程
作者:丶PURSUING
發布時間:2021-02-02 16:51:49
網址:https://blog.csdn.net/weixin_44742824/article/details/113539449?spm=1001.2014.3001.5501

目錄

  • 一、分文件編程的引入
    • 優點
    • 實現
  • 二、庫的概念
    • 什么是庫
    • 靜態庫動態庫優缺點
  • 三、庫的編程
    • 靜態庫
      • 制作
      • 使用
    • 動態庫(常用)
      • 制作
      • 使用(運行時鏈庫需添加環境變量)
  • 四、其他
    • 1.secureCRT支持中文編碼
    • 2. du指令計算文件大小

一、分文件編程的引入

簡單來說就是模塊化編程

優點

  • 分工明確
  • 方便調試
  • 主程序簡潔

實現

EG:用分文件編程的形式寫一個簡單的加法程序

  • 編寫主程序: mainFunc.c
  • #include <stdio.h> #include "addFunc.h"int main() {int num1;int num2;int ret;printf("請輸入第一個加數\n");scanf("%d",&num1);printf("請輸入第二個加數\n");scanf("%d",&num2);ret=funcAdd(num1,num2);printf("結果:%d\n",ret);return 0; }

    < > 直接去默認路徑 /usr/include 尋找頭文件,找不到直接報錯。多用于系統頭文件
    " " 先在當前路徑尋找,沒有則去默認路徑。用于自己創建的頭文件。

    ls /usr/include |grep stdio 篩選

  • 編寫功能程序: addFunc.c
  • int funcAdd(int num1,int num2) {int ret;ret=num1 + num2;return ret; }
  • 新建功能程序的頭文件,對其函數進行聲明:
  • int funcAdd(int num1,int num2);
  • 編譯
  • gcc mainFunc.c addFunc.c
  • 運行
  • ./a.out

    順序總結:聲明(.h文件)-> 定義(.c文件)-> 使用(main函數)

    二、庫的概念

    什么是庫

    庫是一種可執行代碼的二進制形式,可以被操作系統載入內存執行。就是將源代碼轉化為二進制格式的源代碼,相當于進行了加密,別人可以使用庫,但是看不到庫中的內容。

    靜態庫:在程序執行之前(編譯)就加入到目標程序中
    動態庫:是在程序執行時動態(臨時)由目標程序去調用。動態庫與共享庫是同一個東西(linux上叫共享庫,文件后綴.so)(windows上叫動態庫,文件后綴.dll)

    靜態庫動態庫優缺點

    參考博文

    靜態庫優點
    ①靜態庫被打包到應用程序中加載速度快
    ②發布程序無需提供靜態庫,因為已經在app中,移植方便
    靜態庫缺點:
    ①鏈接時完整地拷貝至可執行文件中,被多次使用就有多份冗余拷貝。
    ②更新、部署、發布麻煩。

    動態庫優點:
    ①鏈接時不復制,程序運行時由系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存。
    ②程序升級簡單,因為app里面沒有庫的源代碼,升級之后只要庫的名字不變,函數名以及參數不變,只是實現做了優化,就能加載成功。
    動態庫缺點:
    ①加載速度慢于靜態庫。
    ②發布程序需要提供依賴的動態庫。

    三、庫的編程

    EG:把加法功能的程序分別制作成靜態庫、動態庫,然后使用庫

    源代碼如上文所示,現有主程序 mainFunc.c與功能程序 addFunc.c

    靜態庫

    制作

    交付文件為 .a與帶注釋的 .h

  • 生成.o文件
  • gcc addFunc.c -c
  • 生成.a文件
  • ar rcs libaddFunc.a addFunc.o

    rcs為傳入的參數,輸入ar后回車可查看具體參數的意義

    使用

  • 編譯
  • gcc mainFunc.c -laddFunc -L ./ -o mainStatic

    -laddFunc鏈接庫,為libaddFunc.a的砍頭去尾
    -L 去指定路徑(./)尋找靜態庫。否則默認為到/usr/lib尋找。

  • 運行
  • ./mainStatic

    動態庫(常用)

    制作

    交付文件為 .so與帶注釋的 .h

  • 功能程序生成.so文件
  • gcc -shared -fpic addFunc.c -o libaddc.so

    動態庫的命名只需要前有lib,后有.so即可

    -shared 指定生成動態庫
    -fpic 標準,fPIC 選項作用于編譯階段,在生成目標文件時就得使用該選項,以生成位置無關的代碼。

    使用(運行時鏈庫需添加環境變量)

  • 動態庫鏈接主程序進行編譯
  • gcc mainFunc.c -laddc -L ./ -o mainDy

    此時還不能直接./mainDy運行,運行時動態調庫,會找不到動態庫。(程序執行過程由目標程序去尋找調用動態庫,默認路徑為usr/lib)

  • 解決辦法
  • ①將動態庫拷貝到系統庫的目錄再運行(不建議使用)

    sudo cp libaddc.so /usr/lib/

    ②把當前位置(“動態庫的位置”)作為環境變量再運行

    export LD_LIBRARY_PATH="" //pwd命令將當前路徑放入引號里面

    之前還學習過myCp指令全局可用

    但是這樣的環境變量僅是臨時的,只針對于這個窗口,換了一個窗口又不行了。

    ③寫一個shell腳本,然后運行該腳本

  • 創建一個shell腳本
  • vi start.sh
  • 寫shell腳本代碼(腳本本質就是把多個命令集成在一起)
  • export LD_LIBRARY_PATH=""pwd命令將當前路徑放入引號里面 ./mainProDy
  • 給腳本一個可執行權限
  • chmod +x start.sh
  • 執行該腳本
  • ./start.sh

    四、其他

    1.secureCRT支持中文編碼

    2. du指令計算文件大小

    du mainDy//計算動態庫文件大小(單位是K)

    du xxx -h 當文件較大時可用此指令以M為單位顯示文件大小。

    總結

    以上是生活随笔為你收集整理的linux分文件编程、静态库与动态库的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。