2011-12-27 38 views
2

我想在我的C++項目中使用Rob Hess's SIFT library。我已經查看了其他SIFT實現的代碼,但是這個代碼看起來像最初的Lowe的論文中最相似的,並且也使用了我熟悉的OpenCV,所以我選擇了這個。用C++連接Rob Hess的SIFT庫(用C語言,使用OpenCV)

不幸的是,自從我嘗試在C++中使用它之後,我遇到了麻煩。該庫最初是用OpenCV用C編寫的。

我已經嘗試編譯我的代碼,無論是否包含C庫include -s都與extern,但都不起作用。我想我已經診斷出這兩種情況下的問題,但我不知道如何解決這些問題,我非常感謝任何幫助。

問題(或者至少,我認爲問題是):

  • withouth的extern:不,因爲C的工作++名稱重整(我檢查了,當然,所有的功能名稱被裝飾)

  • extern:不起作用,因爲OpenCV可以檢測它爲C或C++編譯的天氣。有任何的SIFT庫函數沒有聯繫的問題,但現在OpenCV中包括C++頭,並且因爲在主程序它最終包含在extern塊,我得到(字面hundereds)像這樣的錯誤:

    /usr/local/include/opencv2/core/mat.hpp:2361: error: template with C linkage

我一直在努力使這項工作的最後幾天,所以如果有人試圖用C++相同SIFT庫工作或者已經經歷過類似的問題,不同的圖書館,幫助將是最讚賞。

回答

3

看起來我設法找到了一個很好的解決方案。兩種方式,輕鬆優雅:

簡單:

就包括之前extern "C"部分,包括所有的SIFT庫頭在庫(以及任何其他OpenCV頭需要)使用的所有的OpenCV頭。

優雅

在所有的庫頭,加上部分extern "C"周圍所有的代碼除了 OpenCV的包括,就像這樣:

// OpenCV includes: 
#include "cxcore.h" 
#include .... 

#if __cplusplus 
extern "C" { 
#endif 

... 
function definitions in the header file 
... 

#if __cplusplus 
} 
#endif 

現在所有的庫包括可以#include d直接在C++代碼中沒有extern "C"。 OpenCV庫爲C/C++編譯正確(取決於編譯器),並且附加的OpenCV包含的相對順序和SIFT庫包含的內容無關緊要。

+0

看起來我不能接受我自己的答案2天以上,但這解決了問題,我會盡快接受我的答案。希望這可以幫助別人:) – penelope 2011-12-27 18:35:08