動態庫的建立有兩種方法,之前說過了不使用.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...