LinuxC(環境變數 動態庫)

2021-07-10 16:22:42 字數 3176 閱讀 1589

path就是乙個環境變數,存放的是一些系統或者軟體的路徑,在path中新增過路徑的應用程式,可以直接使用檔名進行呼叫。

1)         windows 系統的配置

我的電腦 => 右鍵,選擇屬性 => 高階 => 環境變數 => 系統變數path => 在原來的path後加分號『;』加具體的路徑。

2)         linux系統環境變數

export path=$path:.

解析:$path – 將原來的path的內容獲取出來

: - 各種路徑之間的分割符號

.      - 當前目錄

echo  $path  - 將path的內容列印出來(回顯)。

只會在當前終端中有用,想永久有用則可以開啟

vi ~/.bashrc 《回車》

在該檔案的末尾新增

export path=$path:.

執行source~/.bashrc 這樣就可以讓配置檔案生效。

3)         程式設計相關的環境變數

cpath – c語言標頭檔案的路徑

library_path – 庫檔案的路徑

ld_library_path – 載入共享庫的路徑

4)         查詢標頭檔案

a)      <>表示從系統預設的路徑下查詢該檔案

一般來說在  /usr/include/目錄下

b)     「」表示從當前檔案目錄下查詢該檔案

c)      配置相關的環境變數cpath

如:     export cpath=$cpath:.. 

d)     通過編譯選擇項指定標頭檔案的位置

gcc –i檔案路徑 ***.c

大寫i後面跟路徑

為了呼叫者使用方便,一般程式不會直接提供.c檔案或.o檔案,而是將檔案打包成具體的庫檔案,只需要提供庫檔案和對應的標頭檔案即可。

1)分類

庫檔案主要分為:靜態檔案 和 共享庫檔案

2)比較

靜態庫:

使用靜態庫時,直接把**/指令複製到目標檔案中,目標檔案顯得比較龐大,修改和維護都不方便;可以脫離靜態庫檔案,效率比較高。

共享庫:

使用共享庫時,把**/指令對應的位址複製到目標檔案中,目標檔案比較小,修改和維護比較方便;不可以脫離共享庫檔案,效率比較低(使用頻繁)。

3)相關的命令

ldd  a.out => 檢視a.out 所以來的動態庫檔案

gcc/cc  -static  ***.c =>要求按照靜態庫方式編譯鏈結,得到的可執行檔案會比較大。

(1)靜態庫的生成步驟

a)      編寫源** ***.c 如:adder.c

b)     只編譯不連線,如:gcc  -c  adder.c 生成adder.o

c)      使用命令ar  –r  lib庫名.a  ***.o生成靜態庫

如: ar  –r(插入)  libadder.a adder.o

(2)靜態庫的使用步驟

a)      編寫呼叫的源程式 ***.c 如vi  main.c

b)     只編譯不連線源程式如:gcc  –c  main.c

c)      鏈結目標檔案和靜態庫檔案

i.             直接鏈結

gcc  main.o  libadder.a

ii.             通過選項鏈結(掌握)

gcc main.o  –l(小寫)庫名  –l(大寫).庫檔案所在路徑

gcc  main.o  –l adder  –l.   

iii.             配置環境變數library_path

export library_path=$library_path:.  

gcc  main.o  –l adder

(1)共享庫的生成步驟

a)      編寫源程式***.c 如:adder.c

b)     只編譯不連線

如:gcc  –c  –fpic(小模式)  adder.c

c)      使用選項生成共享庫

如:gcc  -shared adder.o –o lib庫名 .so

(2)  共享庫的使用步驟

a)    直接鏈結

gcc  main.o  libadder.so

b)   使用選項鏈結

gcc  main.o  -l adder  -l.  

c)    使用環境變數library_path

export library_path=$library_path:.  

gcc  main.o  –l  adder

注意:

對共享庫檔案的使用,要配置環境變數後再執行

export ld_library_path=$ld_library_path:.  

#include

void *dlopen(const char *filename, int flag);

第乙個引數:檔名

第二個引數:開啟標誌/開啟方式

rtld_lazy -----延遲載入

rtld_now-----立即載入

函式的功能:

按照第乙個引數指定的檔名去(延遲/立即)載入動態庫。

成功返回乙個void * 的控制代碼。

char *dlerror(void);

函式功能:表示返回最後一次錯誤的資訊,如果沒有錯誤就返回null

void *dlsym(void *handle, const char *symbol);

第乙個引數:dlopen函式的返回值

第二個引數:字串型別的函式名

函式功能:獲取handle指向的共享庫檔案中的symbol載入

int  dlclose(void*handle);

函式功能:關閉指定的共享庫檔案

注意:編譯時需要增加

:-ldl

作業:程式設計列印空心的菱形和實心菱形,分別使用靜態庫的方式和動態庫的方式進行打包和使用。

********

****                       *  *

****                             *  *

****           ****

Linux C 函式參考之環境變數篇

getenv 取得環境變數內容 相關函式 putenv,setenv,unsetenv 表頭檔案 include 定義函式 char getenv const char name 函式說明 getenv 用來取得引數name環境變數的內容。引數name為環境變數的名稱,如果該變數存在則會返回指向該內...

linux c 程式設計 環境變數的操作函式

1.描述 搜尋當前系統name所指向的環境變數。2.標頭檔案 stdlib.h 3.宣告 char getenv const char name 4.引數 const char name 需要獲得的環境變數名稱5.返回值 該函式返回乙個以 null 結尾的字串,該字串為被請求環境變數的值。如果該環境...

linux環境程式設計 環境變數 列印環境變數

在shell程式設計主題中,我們已經大致的介紹過 環境變數和本地變數啦 我們今天來具體的介紹介紹,那環境變數到底是什麼呢?是我 一.環境變數含義 特徵 環境變數是指 作業系統中用來指定作業系統執行環境的一下引數 1 特徵 字串 有統一的格式 名 值 值 值用來描述程序的環境資訊 2 使用形式 與命令...