[問題] dll export symbol的疑問

看板C_and_CPP (C/C++)作者 (我愛阿蓉)時間14年前 (2012/05/30 23:57), 編輯推噓5(5064)
留言69則, 5人參與, 最新討論串1/2 (看更多)
有一個疑問 因為跟dll產生方式不是很熟 一般我看教學文件 或是 VC的dll template 都是在要export的method or variable 前面冠上 __declspec(dllexport) 就連class or struct也是 但衍伸了一些問題 1. 我知道可以用LoadLibrary + GetProcAddress來動態使用 可是如果我只有對方的dll (沒有.h and .lib) 我該怎麼把 例如 MyType API(MyType2* obj); 給 load回來 因為我並沒有.h 我根本不知道MyType是什麼 這樣就很矛盾 我冠上 __declspec(dllexport)在struct前面要幹嘛? 除非對方有.h , 但有了.h 就不用寫 __declspec(dllexport)了吧? 這個struct都認得到了 所以問題可以變成 : __declspec(dllexport) 冠在class or struct 的用途是? 還是不寫上去run time會出問題 2. 我常常會看到有人export dll 搭配一個.def檔案 這很怪....def會記錄你export那些symbol 可是... 我還是不知道你的function prototype 我要怎麼使用你dll export的method.. .def給我的理解似乎是 你要是在.def裡面寫的symbol 就不用再code裡面冠上 __declspec(dllexport) 但.def真正的用途 是什麼 我實在不知道 若只是一個export API list....那我用dumpbin自己看就可以了 像是sqlite 他也只提供.dll + def... http://www.sqlite.org/download.html Precompiled Binaries For Windows 比較好奇我不去偷看他.h 我怎麼可能會知道該怎麼invoke他的API 這樣看來 還是把.h .lib + dll 都給會最方便...這有甚麼缺點嗎? 除了program被載入需要花時間load dll外? 3. VC的dll template可以勾選 要不要export symbol.... 我比較納悶的是 不溝的話 那這dll要幹嘛? 你不export symbol 那dll還有甚麼用途嗎 以上是我測試後 引發的一些疑惑跟想法 請各位有經驗的板友提供點意見 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.192.138.160

05/31 00:06, , 1F
只有 dll 沒有 lib 就乖乖用 GetProcAddr 當然網路上也有
05/31 00:06, 1F

05/31 00:08, , 2F
好幾篇教你怎麼自己產生 lib 的攻略但那只是土法煉鋼而已
05/31 00:08, 2F

05/31 00:11, , 4F
但沒有.h 我不知道該怎麼轉function pointer..
05/31 00:11, 4F

05/31 00:13, , 5F
p大連結裡好像有講? 需要這麼精妙的去找喔 ?
05/31 00:13, 5F

05/31 00:19, , 6F
不需要產生lib啊,你直接放dll近來,要怎樣使用
05/31 00:19, 6F

05/31 00:20, , 7F
給你dll的人本來就應該要給你了
05/31 00:20, 7F

05/31 00:20, , 8F
至少我在用dll的時候,compiler那根本不用加什麼
05/31 00:20, 8F

05/31 00:21, , 9F
只要我在runtime能夠找到dll就好
05/31 00:21, 9F

05/31 00:23, , 10F
你給的那個網站裡面有api可以參考
05/31 00:23, 10F

05/31 00:23, , 11F

05/31 00:23, , 12F
從這裡面找就知道你要用api要怎樣使用了
05/31 00:23, 12F

05/31 00:25, , 13F
正常寫的ok的doc是讓你沒有必要再去看code的
05/31 00:25, 13F

05/31 00:25, , 14F
我用opencv一段時間了,從來沒有去看過他的code
05/31 00:25, 14F

05/31 00:25, , 15F
我覺得這樣的doc就寫的滿不錯的,挺清楚的
05/31 00:25, 15F

05/31 00:26, , 16F
__declspec(dllexport) 所以這個是for implicit link那種
05/31 00:26, 16F

05/31 00:26, , 17F
lib .h .dll都給你一起compile的時候用的嗎?
05/31 00:26, 17F

05/31 00:27, , 18F
d大說都不加就可以用 也是用getprocaddress?
05/31 00:27, 18F

05/31 00:27, , 19F
但是沒.h 他自訂的type我怎麼用阿? 我問題1的疑惑
05/31 00:27, 19F

05/31 00:33, , 20F
不知道 MyType 是什麼,卻想要使用這個函數,是要怎麼填寫
05/31 00:33, 20F

05/31 00:33, , 21F
引數 obj 的內容,這不是異想天開嗎
05/31 00:33, 21F

05/31 00:39, , 22F
GetProcAddress沒錯
05/31 00:39, 22F

05/31 00:40, , 23F
http://ideone.com/bUdzw 之前測試用的
05/31 00:40, 23F

05/31 00:41, , 24F
重點是之前的LoadLibrary要成功load進來就好
05/31 00:41, 24F

05/31 00:42, , 25F
@p大 就是不知道這是啥 沒給.h的話不就不能用了嗎
05/31 00:42, 25F

05/31 00:43, , 26F
@d 大 所以cv::Mat 這還是要有.hpp才能知道這型態吧?
05/31 00:43, 26F

05/31 00:45, , 27F
d大 compile不用加甚麼應該是.h 有寫__declspec(dllimport)
05/31 00:45, 27F

05/31 00:46, , 28F
的macro?
05/31 00:46, 28F

05/31 01:01, , 29F
沒給 .h 不一定不能用某個 dll 匯出函數,前提是你知道其
05/31 01:01, 29F

05/31 01:02, , 30F
每個引數填什麼,大小多大,而 MyType 顯然未知大小與內容
05/31 01:02, 30F

05/31 01:05, , 31F
我編出dll跟使用dll的是兩個不同的project
05/31 01:05, 31F

05/31 01:06, , 32F
.h不會混著用,我不懂為什麼你這麼堅持在.h上?
05/31 01:06, 32F

05/31 01:07, , 33F
因為我使用opencv的型態所以我一定要include opencv
05/31 01:07, 33F

05/31 01:07, , 34F
的才了解那個型態是什麼,如果你用內建的型態就不用
05/31 01:07, 34F

05/31 01:07, , 35F
include任何東西,包涵你build dll的也不用
05/31 01:07, 35F

05/31 01:08, , 36F
基本上你要使用額外的lib並且有用到特定的型態就要
05/31 01:08, 36F

05/31 01:08, , 37F
很想建議原PO實際上建個DLL,再寫個Client端程式使用它
05/31 01:08, 37F

05/31 01:09, , 38F
include那個lib的東西,但這跟你使用別的dll是不相
05/31 01:09, 38F

05/31 01:09, , 39F
這些觀念只要動手做過一次,就會知道怎麼回事了吧...
05/31 01:09, 39F

05/31 01:09, , 40F
關的東西,基本上你直接google關於dll的
05/31 01:09, 40F

05/31 01:09, , 41F
資料就一大堆了
05/31 01:09, 41F

05/31 01:10, , 42F
很想建議原PO買本程式設計師的自我修養,裡面就已經完整講
05/31 01:10, 42F

05/31 01:10, , 43F
你如果只有dll就是要用runtime-linking
05/31 01:10, 43F

05/31 01:11, , 44F
問題是你好像已經有書了
05/31 01:11, 44F

05/31 01:11, , 45F
你有.lib是用compiler linking
05/31 01:11, 45F

05/31 01:11, , 46F
不太知道這兩個名詞對不對,不過我表達compiler
05/31 01:11, 46F

05/31 01:11, , 47F
他一定有<自我修養>,問過好幾次書上的問題了XD
05/31 01:11, 47F

05/31 01:12, , 48F
跟runtime使用dll時機的不同
05/31 01:12, 48F

05/31 01:12, , 49F
那本書不太好懂,講了滿多底層的東西...
05/31 01:12, 49F

05/31 01:13, , 50F
但那本還是滿不錯的一本書
05/31 01:13, 50F

05/31 11:01, , 51F
其實我就是看到她第七章...才問的orz
05/31 11:01, 51F

05/31 11:01, , 52F
大家講的我都了解 只是我不懂的是問題1, 我看sqlite只給def和
05/31 11:01, 52F

05/31 11:02, , 53F
dll 為啥不給.h... 我可以用指令產生.lib 可是還是要拿.h阿
05/31 11:02, 53F

05/31 11:09, , 54F
.h檔只會在編譯的時候用到,載入的時候它不是必要的
05/31 11:09, 54F

05/31 12:52, , 55F
我上面已經回你一堆了= =
05/31 12:52, 55F

05/31 12:53, , 56F
你跟本部需要知道.h檔,他網站就有給你api ref了
05/31 12:53, 56F

05/31 12:53, , 57F
從中找到的東西就跟你.h一樣,而且更為詳細
05/31 12:53, 57F

05/31 12:53, , 58F
你在裡面就能找到他function怎麼用,回傳是什麼型態
05/31 12:53, 58F

05/31 12:54, , 59F
你有用到他特殊的型態才要.h或.lib
05/31 12:54, 59F

05/31 12:55, , 60F
如果他自己的型態只有在他的dll內用到,你不需要碰到
05/31 12:55, 60F

05/31 12:55, , 61F
那你就不用他的.h那些,反正你c++原本就認得了
05/31 12:55, 61F

05/31 13:03, , 62F
建議你自己包個dll然後程式call,你會清楚很多的
05/31 13:03, 62F

05/31 15:33, , 63F
sqlite 連原始碼都給你了,裡面就有 .h
05/31 15:33, 63F

05/31 15:34, , 64F
我用到的lib是都有header檔 若你用的沒header 會不會是
05/31 15:34, 64F

05/31 15:34, , 65F
它有doc 它要你自己打??
05/31 15:34, 65F

05/31 20:20, , 66F
看原PO的回覆,真的不太像有實際動手操作過
05/31 20:20, 66F

05/31 22:28, , 67F
我只是很好奇有沒有只有dll又可以用他自訂type的方法
05/31 22:28, 67F

05/31 22:29, , 68F
不然sqlite應該直接包入.h在zip才是
05/31 22:29, 68F

05/31 22:30, , 69F
結果還是要去找.h來build..
05/31 22:30, 69F
文章代碼(AID): #1FnaDTWB (C_and_CPP)
文章代碼(AID): #1FnaDTWB (C_and_CPP)