動態鏈結庫

2021-09-27 12:18:10 字數 3968 閱讀 3066

2. 生成動態鏈結庫

3. 呼叫動態鏈結庫

3.2 linux版本

在實際程式設計中,我們可以把完成某項功能的函式放在乙個動態鏈結庫裡,然後提供給其他程式呼叫。

下面以codeblocks編譯器為例,其他編譯器也就是建立dll工程不一樣:

file->new->projects->dynamic link library->go

專案的命名就是最後dll的名字,新建main.c和main.h

main.c

#include "main.h"

#include /* 輸入年月日計算一年中第幾天 */

int day_of_year(int year, int month, int day)

sum=sum+day; // 再加上某天的天數

if(year%400==0||(year%4==0&&year%100!=0)) else

if(leap==1&&month>2)

return sum;

}

main.h

#ifndef __main_h__

#define __main_h__

#include #ifdef __cplusplus

#define export extern "c" __declspec (dllexport)

#else

#define export __declspec (dllexport)

#endif // __cplusplus

export int day_of_year(int year, int month, int day);

#endif // __main_h__

編譯成功後在bin\debug目錄下生成3個檔案:dll.dll,libdll.a,libdll.def

main.c

#include "main.h"

#include /* 輸入年月日計算一年中第幾天 */

int day_of_year(int year, int month, int day)

sum=sum+day; // 再加上某天的天數

if(year%400==0||(year%4==0&&year%100!=0)) else

if(leap==1&&month>2)

return sum;

}

main.h

#ifndef __main_h__

#define __main_h__

int day_of_year(int year, int month, int day);

#endif

在命令列下輸入gcc -shared -fpic main.c -o libday.so即可生成乙個名為libday.so的動態鏈結庫

新建工程,把上面生成的dll.dll和libdll.a(不可缺)拷貝到新工程的bin\debug目錄下

main.c

#include #include "main.h"

int main()

main.h保持一樣

#ifndef __main_h__

#define __main_h__

#include #ifdef __cplusplus

#define export extern "c" __declspec (dllexport)

#else

#define export __declspec (dllexport)

#endif // __cplusplus

export int day_of_year(int year, int month, int day);

#endif // __main_h__

project - build options - linker settings - add 選擇 bin\debug\libdll.a - 確定,然後再編譯即可

新建工程,把dll.dll拷貝到新工程的bin\debug目錄下

main.c

#include #include typedef int(*getday)(int, int, int); //定義函式型別

hinstance hdll; //dll控制代碼

getday getday;

int main()

編譯就可以使用,當dll程式公升級時,只需要替換dll,而不用重新編譯exe

linux版本動態鏈結庫沒有windows版本那麼多檔案,只有乙個so檔案

test.c

#include #include "main.h"

int main()

在命令列輸入gcc -o test test.c -l./ libday.so然後執行編譯生成的可執行檔案./test注意加上匯出函式標頭檔案main.h,-l指定動態鏈結庫的搜尋路徑

test.c

#include #include // 顯式載入需要用到的標頭檔案

int main()

int (*day_num)() = dlsym(pdlhandle, "day_of_year"); // 定位動態鏈結庫中的函式

if( !day_num )

printf("day = %d\n", day_num(2015, 10, 1)); // 呼叫動態鏈結庫中的函式

dlclose(pdlhandle); // 系統動態鏈結庫引用數減1

return 0;

}

在命令列輸入gcc -o test test.c -ldl然後執行編譯生成的可執行檔案./test1)錯誤一

/tmp/ccmpgznu.o: in function `main':

test.c:(.text+0x13): undefined reference to `dlopen'

test.c:(.text+0x1c): undefined reference to `dlerror'

test.c:(.text+0x53): undefined reference to `dlsym'

test.c:(.text+0x63): undefined reference to `dlerror'

test.c:(.text+0x89): undefined reference to `dlclose'

test.c:(.text+0xc7): undefined reference to `dlclose'

collect2: error: ld returned 1 exit status

解決方案:

2)錯誤二

error while loading shared libraries: libtiger.so: cannot open shared object file: no such file or direct
我的這段**裡則會列印load lib.so failed!解決方案:

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...

靜態鏈結庫,動態鏈結庫

關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...