[問題] 詢問DLL檔問題

看板C_and_CPP (C/C++)作者 (阿呆)時間14年前 (2011/08/30 22:55), 編輯推噓7(7037)
留言44則, 4人參與, 最新討論串1/1
開發平台: NT4.0 CODE BLOCK 問題: C程式連結XXX.LIB,結果執行時,顯示沒定義此函數(可能的原因是XXX.LIB沒進來) 先說明,當初程式(美國人寫的),只留下XXX.DLL、XXX.LIB、XXX.H 因我需要用到XXX.H裡面函數,故我需IINK XXX.LIB 正確結果: 有LINK XXX.LIB進來,並使用該XXX.H裡面函數 錯誤結果: 顯示沒定義此函數 程式碼: 主程式 #include "stdio.h" #include "stdlib.h" #include "XXX.H" #pragma comment(LIB,"XXX.LIB")///link XXX.LIB program #ifdef ******* #define ******* _declspec(dllexport) #else #define ******* _declspec(dllimport) #endif 上面********(我從XXX.H裡面沒看到這幾個關鍵字宣告,所以我不知該填什麼) 會無法定義,主要是我無法得知*******這個關鍵字是什麼??? int main(void) { 呼叫XXX.H函數 return 0; } 請教各位大大,如果無法得知關鍵字的話,那宣告該怎麼寫 才可以link XXXX.LIB檔 因XXX.H檔我目前手上沒有(放在公司) 不過小弟有剪XXX.H裡面幾張圖給大家看(之前在公司剪的) 通常在寫DLL時,不是會在XXX.H裡面宣告幾行重要的東西 例如: #ifdef LIBS_PUBLIC_EXPORTS (程式內部提供的,舉例) #define LPSV2_PUBLIC_DLL(關鍵字) _declspec(dllexport) #else #define LPSV2_PUBLIC_DLL(關鍵字) _declspec(dllimport) #endif LPSV2_PUBLIC_DLL void write_cal_log_from_struct (cal_t *cal,const char *mode_log); 函數前面會加上宣告關鍵字 可是我在XXX.H裡面沒看到?圖如下: http://www.wretch.cc/album/show.php?i=CJSHF&b=15&f=1048963582&p=0 http://www.wretch.cc/album/show.php?i=CJSHF&b=15&f=1048963583&p=1 http://www.wretch.cc/album/show.php?i=CJSHF&b=15&f=1048963584&p=2 http://www.wretch.cc/album/show.php?i=CJSHF&b=15&f=1048963585&p=3 請問一下,像這種XXX.H裡面沒宣告,但我主程式在LINK XXX.LIB時 那我該怎麼宣告那些函數?? 如果板上有人知道的話,可以告知小弟一下 我會非常感謝 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.129.70.111

08/30 23:00, , 1F
我竟聽不懂你的問題,還覺得敘述是不是有點本末倒置?
08/30 23:00, 1F

08/30 23:07, , 2F
不用管 **** 那是用 LoadLibrary 時才需要用到
08/30 23:07, 2F

08/30 23:08, , 3F
應該直接在 main 調用 dll 裡的函數,加上 pragma 就行吧
08/30 23:08, 3F

08/30 23:14, , 4F
一樓,不好意思,可能我表達能力不好,抱歉!!!
08/30 23:14, 4F

08/30 23:17, , 5F
P大,你意思是只加入XXX.H與pragma xxx.lib這二個是嗎?
08/30 23:17, 5F

08/30 23:17, , 6F
你最大問題是,你看不到函式原型,還是看不到enum/macro?
08/30 23:17, 6F

08/30 23:20, , 7F
對呀,就跟你使用 MessageBox 一樣,只是 windows.h 加上
08/30 23:20, 7F

08/30 23:20, , 8F
pragma lib user32.lib 就可以呼叫 user32.dll 一樣狀況
08/30 23:20, 8F

08/30 23:23, , 9F
P大,你的方法 我今早有試過,好像不行!一樣顯示無定義
08/30 23:23, 9F

08/30 23:27, , 10F
好吧,但不管你 ******* 怎個改,那個地方都不是阻止 lib
08/30 23:27, 10F

08/30 23:27, , 11F
有沒有載入的原因,理論上 VC 只需要 pragma 那行就載入
08/30 23:27, 11F

08/30 23:28, , 12F
code block.
08/30 23:28, 12F

08/30 23:28, , 13F
原來如此...........換編譯器吧
08/30 23:28, 13F

08/30 23:30, , 14F
推 p 大
08/30 23:30, 14F

08/30 23:30, , 15F
這跟code block有關嗎?
08/30 23:30, 15F

08/30 23:31, , 16F
各家 os,compiler 實做 lib/dll 多少會有差異.
08/30 23:31, 16F

08/30 23:31, , 17F
P大意思,是指只要包含XXX.H與XXX.LIB這二個即可,其他不用
08/30 23:31, 17F

08/30 23:31, , 18F
是這個意思嗎?
08/30 23:31, 18F

08/30 23:32, , 19F
__declspec 跟 pragma 皆是微軟專用 (沒記錯的話)
08/30 23:32, 19F

08/30 23:32, , 20F
因只能用free,所以就採用code block,不然像dev好像沒它強
08/30 23:32, 20F

08/30 23:34, , 21F
可是我的編譯器不是用微軟的,如果使用pragma會有差嗎?
08/30 23:34, 21F

08/30 23:37, , 22F
現在最大問題是,不同編譯器編出來之lib/dll 未必能共用
08/30 23:37, 22F

08/30 23:37, , 23F
最有名的討論是 vc lib to bcb lib,執著要用c.b 延續,
08/30 23:37, 23F

08/30 23:37, , 24F
應先去解決這問題才是。
08/30 23:37, 24F

08/30 23:38, , 25F
等版上強者回答你,我只熟 VC
08/30 23:38, 25F

08/30 23:38, , 26F
是喔!那完了,因為我不知美國人是用那個compiler
08/30 23:38, 26F

08/30 23:39, , 27F
Visual Studio Express 不用錢啊...
08/30 23:39, 27F

08/30 23:40, , 28F
p 大給提示了啊, 那個 lib/dll 是用 vc 弄出來的.
08/30 23:40, 28F

08/30 23:41, , 29F
這個LIB,至少有十幾年了,看來只能try看看
08/30 23:41, 29F

08/30 23:42, , 30F
十年前的話,vc6.0開發機率大,1998年出產。
08/30 23:42, 30F

08/30 23:42, , 31F
還是很感謝大家的回覆,感謝!!
08/30 23:42, 31F

08/30 23:43, , 32F
我印象是1996開發的,那時是vc6.0時代嗎?
08/30 23:43, 32F

08/30 23:44, , 33F
現在為什麼還有這麼守法的小公司
08/30 23:44, 33F

08/30 23:46, , 34F
因為在傳產工作,使用的系統都老舊系統,況且程式還是在NT上
08/30 23:46, 34F

08/30 23:46, , 35F
Visual Studio 97/1997(5.0), Visual Studio/1995(4.0)
08/30 23:46, 35F

08/30 23:46, , 36F
那兩個版本都沒用過,只在書上看過。
08/30 23:46, 36F

08/30 23:47, , 37F
P大,我會用vc try看看,只要包括xxx.h與xxx.lib這二個就行
08/30 23:47, 37F

08/30 23:47, , 38F
是嗎?
08/30 23:47, 38F

08/30 23:48, , 39F
08/30 23:48, 39F

08/30 23:49, , 40F
感謝p大與t大的回覆,我明天再去公司試看看!感謝!!
08/30 23:49, 40F

08/31 00:30, , 41F
耶..我可能要更誤一下,再看一次原文,那個lib/dll是用什
08/31 00:30, 41F

08/31 00:31, , 42F
麼開發確實未知,唯 nt 4.0 是 1996 出產,當時 cpu 應都
08/31 00:31, 42F

08/31 00:32, , 43F
還是 16-bit 居多,是這樣的話,Turbo C 也可能編lib/dll
08/31 00:32, 43F

08/31 00:33, , 44F
若被我猜中的話,這將是一個大工程...
08/31 00:33, 44F
文章代碼(AID): #1ENFd9UN (C_and_CPP)
文章代碼(AID): #1ENFd9UN (C_and_CPP)