全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1009
推到 Plurk!
推到 Facebook!

dll compile的問題

尚未結案
yslin
一般會員


發表:5
回覆:17
積分:4
註冊:2003-11-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-10 00:50:14 IP:140.109.xxx.xxx 未訂閱
請問一下,我用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-10 19:46:37 IP:140.109.xxx.xxx 未訂閱
沒人回應,那我就來自言自語好了... 在試過一些改變之後,用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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-10 21:23:47 IP:211.75.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-11 00:22:31 IP:140.109.xxx.xxx 未訂閱
引言: dllexport? 應該是 dllimport 吧.
換成dllimport的話,也是一樣的結果,因為link error是無法找到外部的dll函式。
引言: 要混合呼叫的建議這樣寫: #ifdef __cplusplus extern "C" { #endif function prototype here #ifdef __cplusplus } #endif
在這個例子中應該還沒用到混合呼叫...應該吧
miyu
中階會員


發表:13
回覆:96
積分:91
註冊:2003-05-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-11 19:45:45 IP:211.75.xxx.xxx 未訂閱
引言:
引言: dllexport? 應該是 dllimport 吧.
換成dllimport的話,也是一樣的結果,因為link error是無法找到外部的dll函式。
那個是給 linker 看的. static link 跟 dynamic link 的作法不太一樣
引言: 要混合呼叫的建議這樣寫: #ifdef __cplusplus extern "C" { #endif function prototype here #ifdef __cplusplus } #endif
在這個例子中應該還沒用到混合呼叫...應該吧 [/
yslin
一般會員


發表:5
回覆:17
積分:4
註冊:2003-11-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-11 23:52:39 IP:140.109.xxx.xxx 未訂閱
那我來仔細描述一下好了:    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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-11-12 00:18:39 IP:140.135.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-11-12 00:57:05 IP:140.109.xxx.xxx 未訂閱
版主您好: 這個程式我已重複試過多次,在miyu還沒建議下其實也有試過那個混合呼叫的code,但是也許那時的附檔名是cpp所以沒有改善,真是抱歉... 果然注意一下版主的二點建議就可以了...真是感謝二位的回應
miyu
中階會員


發表:13
回覆:96
積分:91
註冊:2003-05-01

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-11-12 22:39:36 IP:211.75.xxx.xxx 未訂閱
引言: 版主您好: 這個程式我已重複試過多次,在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)
{
}
也是可以的. 只是這樣子要寫兩次很累而已, 也容易漏掉 --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子
系統時間:2024-07-29 8:48:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!