c 動態函式庫的建立與呼叫 def

2021-08-19 15:06:25 字數 1743 閱讀 7045

動態庫的建立有兩種方法,之前說過了不使用.def的方法,現在說一下使用.def的方法

環境vs2005

寫個簡單的動態庫,裡面有兩個函式,能實現加法減法

首先建立乙個空專案dll,建立標頭檔案

在標頭檔案

在原始檔

在原始檔的模組定義檔案

f7生成動態庫

在.def中第一行是資料庫的名字,第二行是固定語句exports,匯出**,下面add跟sub後面可以不加@x(這裡就有兩種方法匯出動態庫里的函式,後面會說)

隱式呼叫

在同一解決方案下建立空win32控制台專案,在原始檔中建立

執行結果

這樣隱式呼叫就完成了

注意:隱式呼叫需要用到動態庫里的標頭檔案

顯式呼叫

在同一解決方案下建立win32控制台空專案,在原始檔中建立

執行結果

在顯式呼叫中,由於使用的是.def的方法,在獲取動態庫中函式位址時有兩種方法

addfunc add1 = (addfunc)getprocaddress(hdll,(char*)(1));這是在.def檔案中add後面加@1的使用方法,當然你也可以使用通用獲取位址方法 addfunc add1 = (addfunc)getprocaddress(hdll,"add");

addfunc add1 = (addfunc)getprocaddress(hdll,(char*)(1));這句(char*)(1)中1是add後面@的數字,相當於add在動態庫中的位址,getprocaddress的函式原型裡1這個位置資料型別是char*型別.

附.def的一些小知識:

.def 檔案中的第一條 library 語句不是必須的,但library 語句後面的 dll 的名稱必須正確,即與生成的

動態鏈結庫的名稱必須匹配。此語句將 .def 檔案標識為屬於 dll。

鏈結器將此名稱放到 dll 的

導入庫中。

exports 語句列出名稱,可能的話還會列出 dll 匯出函式的序號值。通過在函式名的後面加上 @ 符和乙個數字,給函式分配序號值。當指定序號值時,序號值的範圍必須是從 1 到 n,其中 n 是 dll 匯出函式的個數。

library btree

exports

insert @1

delete @2

member @3

min @4

「def   檔案中的注釋由每個注釋行開始處的分號   (;)   指定。注釋不能與語句共享一行,但可以在多行語句的規範間出現。

靜態函式庫與動態函式庫的設計

函式庫存放位置 linux應用程式使用的主要函式均放在 lib和 usr lib目錄下,其中採用 so.命名的是動態函式庫,而以 a方式命名的是靜態函式庫。靜態函式庫的特點 程式所要用到的庫函式 在鏈結時全部被copy到程式中。導致的問題 如果有多個程序在記憶體中同時執行,並且使用了相同的函式庫,那...

Linux 下的靜態(函式)庫 動態(函式)庫

不用指定生成.o檔名 預設生成file1.o,file2.o,file3.o ar rv libname.a file1.o file2.o file3.or 將flie1.o,file2,o,file3.o插入archive,如故原先archive中已經存在某檔案,則先將該檔案刪除。v 顯示ar操...

Linux的靜態函式庫和動態函式庫

一 在linux中,有兩種函式庫,以 so字尾命名的是動態函式庫,以 a字尾命名的是靜態函式庫 二 靜態函式庫 1 靜態函式庫是多個目標檔案 o的集合 2 可以使用ar命令 archiver 來生成.a檔案 gcc c part a.c gcc c part b.c ar r libtest.a p...