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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用

發布時間:2023/12/10 pytorch 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一篇文章學習了編譯的過程,點擊鏈接查看:【C語言進階深度學習記錄】十五 編譯過程簡介,每一個C源文件編譯后將會生成目標文件,那么這些目標文件,還需要鏈接起來,生成可執行文件。

文章目錄

    • 1 鏈接的意義
    • 1.1 靜態鏈接
      • 1.11 Linux下靜態庫的創建和使用
      • 1.12 靜態庫創建使用代碼案例分析
    • 1.2 動態鏈接
      • 1.21 Linux下動態庫的創建和使用
      • 1.22 動態庫創建使用代碼案例分析
    • 2 總結

1 鏈接的意義

鏈接的主要作用就是把各個模塊之間的相互引用的部分處理好,使得各個模塊之間能夠正確的銜接。像下圖這樣:

1.1 靜態鏈接

  • 由鏈接器在鏈接時將 直接加入到可執行程序中。像下圖這樣。

1.11 Linux下靜態庫的創建和使用

  • 編譯靜態庫源碼:gcc -c lib.c -o lib.o
  • 生成靜態庫文件:ar -q lib.a lib.o
  • 使用靜態庫編譯:gcc main.c lib.a -o main.out

1.12 靜態庫創建使用代碼案例分析

  • 代碼 20-1.c
#include <stdio.h>extern char* name(); extern int add(int a, int b);int main() {printf("Name: %s\n", name());printf("Result: %d\n", add(2, 3));return 0; }
  • 靜態庫源代碼 slib.c
char* name() {return "Static Lib"; }int add(int a, int b) {return a + b; }

將上述代碼slib.c編譯生成靜態庫:

  • gcc -c slib.c -o slib.o
  • ar -q slib.a slib.o
  • 然后使用生成的slib.a 靜態庫編譯代碼 20-1.c

    • gcc 20-1.c slib.a -o 20-1.out

    運行生成的可執行文件:

    ./20-1.out

    結果如下:

    1.2 動態鏈接

    • 可執行程序在運行的時候才加載庫進行鏈接
    • 庫的內容不會像靜態鏈接那樣被直接加到可執行文件中
    • 所以,動態鏈接節省內存空間

    1.21 Linux下動態庫的創建和使用

    • 編譯動態庫源碼:gcc -shared dlib.c -o dlib.so
    • 使用動態庫編譯:gcc main.c -ldl -o main.out
    • 在使用動態庫的時候,在代碼中需要使用一些動態庫的系統調用,關鍵的有以下幾個:
  • dlopen : 打開動態庫文件,這個動作會將動態庫加載到內存中
  • dlsysm:查找已經被加載到內存中的動態庫中所需要的符號(函數或者變量),并返回找到函數的內存地址
  • dlclose:關閉動態庫文件
  • 1.22 動態庫創建使用代碼案例分析

    • 代碼 20-2-lyy.c
    #include <stdio.h> #include <dlfcn.h>int main(){void* pdlib = dlopen("./dlib.so", RTLD_LAZY); //將動態庫加載到內存中char* (*pname)(); int (*padd)(int, int); if(NULL != pdlib){pname = dlsym(pdlib, "name"); //在動態庫中查找 name 這個函數padd = dlsym(pdlib, "add"); //在動態庫中查找 add 這個函數if ((NULL != pname) && (NULL != padd)){printf("Name = %s\n", pname());printf("Result = %d\n", padd(2, 3));}dlclose(pdlib); // 關閉動態庫}else{printf("Cannot open dlib....\n");}return 0; }
    • 動態庫源代碼 dlib.c
    char* name() {return "Dynamic Lib"; }int add(int a, int b) {return a + b; }

    首先將上述動態庫源代碼編譯生成動態庫文件:

  • gcc -shared dlib.c -o dlib.so
  • 然后編譯運行20-2-lyy.c源代碼,此代碼在運行的過程中會自己去打開動態庫進行鏈接

  • gcc 20-2-lyy.c -ldl -o 20-2.out
  • 運行生成的可執行代碼,結果如下圖:

    上述動態庫的創建很簡單,使用的話,就學會使用上述的三個關鍵的系統調用函數即可。

    2 總結

    • 鏈接是指將多個目標文件連接為最終的可執行文件
    • 根據鏈接的方式不同,分為靜態鏈接域動態鏈接:
  • 靜態鏈接:靜態庫函數文件直接鏈接進目標文件中,程序的體積比較大
  • 動態鏈接:相關庫函數不直接與可執行文件連接在一起,而是在可執行程序運行起來后,再動態的加載動態庫文件到內存中然后與其進行鏈接。
  • 總結

    以上是生活随笔為你收集整理的【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用的全部內容,希望文章能夠幫你解決所遇到的問題。

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