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

bcb import vc dll的問題,內含class

答題得分者是:aftcast
sayhuthut
一般會員


發表:1
回覆:2
積分:0
註冊:2011-01-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-01-12 12:43:17 IP:140.115.xxx.xxx 訂閱
各位前輩好,我想請問為什麼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
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-01-12 14:32:13 IP:210.64.xxx.xxx 訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-01-12 15:22:28 IP:140.115.xxx.xxx 訂閱
以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
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-01-12 17:10:06 IP:210.64.xxx.xxx 訂閱
關於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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-01-12 18:22:12 IP:140.115.xxx.xxx 訂閱
謝謝你的解說,這樣我就了解了。
所以我們平常使用的opencv的function都是c的那個部份, 也因為這樣,雖然我是import原先就編好的lib和dll,卻不會遇到mangling的問題。
我一開始只看到opencv裡有定義,卻沒注意到我並沒有使用到class的部份,是我太大意了。
非常謝謝你為我解惑!
系統時間:2017-12-16 20:48:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!