bcb import vc dll的問題,內含class |
答題得分者是:aftcast
|
sayhuthut
一般會員 發表:1 回覆:2 積分:0 註冊:2011-01-12 發送簡訊給我 |
各位前輩好,我想請問為什麼opencv的lib中有class,但是bcb卻能夠import opencv的lib。
會有這個問題是因為最近我在學習aam,我從這個http://code.google.com/p/asmlibrary/網站裡下載了他的lib,一開始我先用vc 2010,確定能夠正常編譯。 但是我後來要轉到bcb的時候,卻出了問題,問題是link error unresolved external。 我有用implib及coff2omf轉成bcb用的lib,也確定有將lib包進來,而且在lib裡定義的一般function都可以連結成功(有加extern "C"),出錯的那幾個function都是包在class裡的member function。 所以我就找了一下資料,似乎問題是出在lib中的class沒有辦法在vc和bcb間轉換使用,但是我在opencv裡也有用到class,卻沒有這種連結問題,想請問是不是有人知道原因在哪裡呢?又該如何解決呢? 謝謝各位。 |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
opencv的lib中有class ? 我印象中好像沒有…還是我沒注意到? 你是用到三方提供的c++ wrapper for opencv 的class嗎? 因為opencv是可被單純c語言使用,不會有class吧?有的話…c 語言怎呼叫? 此外, c 語言的struct 與 c++ 的struct 是不一樣的東西,但"長的有點像"class,沒混淆吧?
此外,重要的是「一旦你使用extern "c",就表示不使用c 的東西,所以class當然是不能用的(class是c 才有的)」 但若你不加 extern "c",那因為vc 與bc 的mangling機制不同,更不可能可以通! 所以,vc 寫的class的member function,是不能被"直接"在dll裡叫著用!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
sayhuthut
一般會員 發表:1 回覆:2 積分:0 註冊:2011-01-12 發送簡訊給我 |
以cv.h為例,在最末幾行中,有這樣的定義
[code cpp] #ifdef __cplusplus #include "cv.hpp" #endif[/code] 有一些class的就定義在cv.hpp中,因此我才會覺得opencv中有使用了class。 例加: [code cpp] class CV_EXPORTS CvBaseImageFilter { public: CvBaseImageFilter(); /* calls init() */ CvBaseImageFilter( int _max_width, int _src_type, int _dst_type, bool _is_separable, CvSize _ksize, CvPoint _anchor=cvPoint(-1,-1), int _border_mode=IPL_BORDER_REPLICATE, CvScalar _border_value=cvScalarAll(0) ); virtual ~CvBaseImageFilter(); . . [/code] 而extern "C"是為了消除mangling這點我清楚,但是問題就出在extern "C"只對一般的function有用,在class中定義的function還是一樣會附加compiler自定義的符號,不知道這個問題是不是真的無解呢?
編輯記錄
sayhuthut 重新編輯於 2011-01-12 00:25:14, 註解 無‧
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
關於opencv,我在查了一下wiki的新資料。它在2點0以後,是加了一小部份c++的實作。但是…
若你是下載它的原碼,然後整個重新在c builder裡編譯,那當然是沒問題的。(class 當然可以取用) 若你拿到的是已經用vc 編好的lib dll檔(無源碼),那你可以用vc取用,也沒問題。(關於class的部份,同是vc mangle 出來的) 若你拿到的是已經用vc 編好的lib dll檔(無源碼),你想在bcb裡使用,那你就要coff轉omf,但是關於c 的部份功能,你就是無法使用了,因為你必然要加入extern "c" 才可以使用該 dll。 回到你的原問題,你說的那個dll,若是沒有源碼的情形下,你就是要coff轉omf (你做到了),但是關於c 的部份,就是沒辦法! 因為 vc 與 bc 的mangling的機制完全不同。 所以,結論就是… 沒辦法。除非你有源碼,直接加入轉案用bcb來compile。 補充說明 : opencv 在2點0版後,c語言與其他java,python等語言,都無法使用某些class的東西,原因就在它們 1/ 無法編c 的程式 2/ 所以只能用dll 來呼叫,但因該dll只能使用非類別的export出來的函式,所以某些類別上的演算法也是無法使用的。
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2011-01-12 03:20:43, 註解 無‧
|
sayhuthut
一般會員 發表:1 回覆:2 積分:0 註冊:2011-01-12 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |