dll compile的問題 |
尚未結案
|
yslin
一般會員 發表:5 回覆:17 積分:4 註冊:2003-11-03 發送簡訊給我 |
請問一下,我用bcb的dll wizard選項要產生dll檔時,wizard一開始不是有問source type是c or c 。我是照一般的bcb書上的步驟來學,通常都是選c 的方式,如加上一個簡單的函式:
int __declspec(dllexport) __stdcall add(int m,int n)
{
int sum=m n;
return sum;
}
然後build project,得到dll及lib。
然後在另一個project中引用這個dll時,在目錄下複製此二檔,和在project中加入此lib檔,且在程式中include由
int __declspec(dllexport) __stdcall add(int m,int n);
所組成的h檔,然後程式引用add(1,2)。 我的問題是,當我用dll wizard選用source type為c 時,所有的步驟皆ok,且程式引用此dll也沒問題。但是一旦source type為c時,build沒問題,也產生了dll及lib,但是在別的程式中引用此dll時,compile皆會產生
[Linker Error] Unresolved external '__stdcall add(int,int)' .....
why???有人知道原因嗎???
PS.兩者的差異是在選source type,所有的步驟皆相同。
|
yslin
一般會員 發表:5 回覆:17 積分:4 註冊:2003-11-03 發送簡訊給我 |
沒人回應,那我就來自言自語好了... 在試過一些改變之後,用source type為c及c 所產生出來的dll和lib將之tdump出來之後,比較一下... c:
Exports from Project1.dll
2 exported name(s), 2 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- ---- ---- ----
000020F8 2 0000 ___CPPdebugHook
00001250 1 0001 add c :
Exports from Project1.dll
2 exported name(s), 2 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- ---- ---- ----
00001250 1 0000 __stdcall add(int, int)
000020F8 2 0001 ___CPPdebugHook 似乎有些蹊蹺...不知是否因為00001250的差異,
如此所以用c的話,老是出現unresolved external "__stdcall add(int,int)"之類的error
我是c和c 的新手請懂的人幫幫忙吧... 發表人 - yslin 於 2003/11/10 19:49:18
|
miyu
中階會員 發表:13 回覆:96 積分:91 註冊:2003-05-01 發送簡訊給我 |
引言: int __declspec(dllexport) __stdcall add(int m,int n); 所組成的h檔,然後程式引用add(1,2)。dllexport? 應該是 dllimport 吧. 引言: 我的問題是,當我用dll wizard選用source type為c 時,所有的步驟皆ok,且程式引用此dll也沒問題。但是一旦source type為c時,build沒問題,也產生了dll及lib,但是在別的程式中引用此dll時,compile皆會產生 [Linker Error] Unresolved external '__stdcall add(int,int)' ..... why???有人知道原因嗎??? PS.兩者的差異是在選source type,所有的步驟皆相同。聽起來像是 name conversion 的問題 要混合呼叫的建議這樣寫: #ifdef __cplusplus extern "C" { #endif function prototype here #ifdef __cplusplus } #endif --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子 |
yslin
一般會員 發表:5 回覆:17 積分:4 註冊:2003-11-03 發送簡訊給我 |
|
miyu
中階會員 發表:13 回覆:96 積分:91 註冊:2003-05-01 發送簡訊給我 |
引言:那個是給 linker 看的. static link 跟 dynamic link 的作法不太一樣引言: dllexport? 應該是 dllimport 吧.換成dllimport的話,也是一樣的結果,因為link error是無法找到外部的dll函式。 引言: 要混合呼叫的建議這樣寫: #ifdef __cplusplus extern "C" { #endif function prototype here #ifdef __cplusplus } #endif在這個例子中應該還沒用到混合呼叫...應該吧 [/ |
yslin
一般會員 發表:5 回覆:17 積分:4 註冊:2003-11-03 發送簡訊給我 |
那我來仔細描述一下好了: s1:
開啟bcb,new一個dll wizard,source type選擇c,右邊全不選。
在程式最下方加上如下程式: int __declspec(dllexport) __stdcall add(int m,int n)
{
int sum=m+n;
return sum;
}
存檔,然後build project,得到dll及lib。 然後在新開另一個application project,將剛得到的dll和lib複製到新project的目錄下。在project->add to project中引用這個lib。
另新增一個xxx.h檔,加上一行:
int __declspec(dllexport) __stdcall add(int m,int n); 然後在project中的include加上#include "xxx.h"。
在form加上一個bottom及一個edit。
在botton double click產生action,
加上Edit1->Text=add(1,2);
Run it...and click the botton
應該會有如:
[Linker Error] Unresolved external '__stdcall add(int,int)' .....
的錯誤吧!!
如果一開始goto s1,選用source type為c 時,所有的步驟皆相同。
run it...
沒有錯誤產生喔。 發表人 - yslin 於 2003/11/12 00:00:20 發表人 - yslin 於 2003/11/12 00:18:14
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
yslin您好:
我按照您的步驟測試的結果沒有問題耶
我大概能猜出您的問題在哪邊
< class="code">
1.先確定您剛開始
int __declspec(dllexport) __stdcall add(int m,int n)
{
int sum=m n;
return sum;
}
是存成*.c而不是*.cpp 2.***.h改成下面形式
#ifdef __cplusplus
extern "C" {
#endif
int __declspec(dllexport) __stdcall add(int m,int n);
#ifdef __cplusplus
}
#endif 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~>
|
yslin
一般會員 發表:5 回覆:17 積分:4 註冊:2003-11-03 發送簡訊給我 |
|
miyu
中階會員 發表:13 回覆:96 積分:91 註冊:2003-05-01 發送簡訊給我 |
引言: 版主您好: 這個程式我已重複試過多次,在miyu還沒建議下其實也有試過那個混合呼叫的code,但是也許那時的附檔名是cpp所以沒有改善,真是抱歉... 果然注意一下版主的二點建議就可以了...真是感謝二位的回應改成 .c 就可以了? 那就是 name conversion 的問題啊. 所以就是我之前講的, 用 extern "C" 就可以解決了啊 我剛看了一下, BCB dll wizard 生出來的 code 只有 include windows.h 如果說你加上了 #ifdef __cplusplus extern "C" #endif在 header, 卻沒有 include 那個 header, compiler 當然是照副檔名去決定 type. 換句話說, compiler 根本沒看到 那個 extern "C" 如果說你的 .cpp file沒有 include 那個 header, 就改成 extern "C" int __declspec(dllexport) __stdcall add(int m, int n) { }也是可以的. 只是這樣子要寫兩次很累而已, 也容易漏掉 --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |