2010-05-06 49 views
18

如果我的C++項目是用CLR支持編譯的,我正在使用OpenCV庫,並且它的一個頭文件cxoperations.hpp生成了"warning C4793: 'anonymous namespace'::CV_XADD' : function compiled as native"。我可以通過周圍的OpenCV的頭防止警告包括這樣的:人們如何處理警告C4793:'some_function':函數編譯爲本地?

#pragma managed(push,off) 
#include <cv.h> 
#pragma managed(pop) 

但實際上使用了OpenCV沒有與CLR支持編譯項目,這是一個本地C++靜態庫。該項目具有CLR支持,並在沒有編譯指示語句的情況下生成此警告,只是使用此靜態庫。所以我有點驚訝的是,警告是根本創建的,特別是考慮到整個靜態庫不是用CLR支持編譯的,但它只是這個頭引發了問題。

因此,這個解決方案似乎對我來說是次優的。你是如何處理這個警告的,或者你能推薦一個更好的做法嗎?

+0

可能要考慮增加一個 「C++/CLI」 標籤。 – 2010-05-06 22:55:56

回答

14

我想你想要的是這樣的:

#pragma unmanaged 
#include <cv.h> 
#pragma managed 
// managed code wrapping unmanaged opencv functions 

A C++/CLI項目可以包含託管和非託管的部分,編譯器會爲你的2間護理編組數據。管理入口點可以從普通的.NET應用程序(比如C#和其他應用程序)中調用,並且會使用垃圾回收,他們會調用非託管函數來完成繁重的工作。

+0

我發佈的編譯指示與您建議的編譯指示之間有區別嗎?我無法在網上找到任何明確的方式,儘管他們在我看來具有相同的效果。 – 2010-05-07 15:07:16

+0

不確定,但這是我在MSDN中看到的。 – Blindy 2010-05-07 19:12:53

+1

經過一段時間的使用後,我發現這種結構稍微不夠理想。也就是說,如果在編譯時沒有CLR支持的情況下使用此構造,它會返回警告C4949,而push-pop構造不會給出警告。 – 2010-06-04 16:55:24

3

我想你應該壓制這個警告。 MSDN doc明確指出,在包含語句之前不應使用託管/非託管雜注。

#pragma warning(disable: 4793) // methods are compiled as native (clr warning) 
#include <cv.h> 
#pragma warning(pop) 
1

如果你不能改變現有的代碼文件,您可以通過禁用顯示warning 4793特定文件CLR支持擺脫警告。當然,這隻有在這個文件沒有使用CLR特性時纔有效。

要禁用特定文件的CLR支持,請在解決方案資源管理器中找到它,右鍵單擊並打開其屬性頁。設置公共語言運行時間支持沒有公共的語言運行時支持。不要忘記這麼做所有配置所有平臺

Turn off CLR support per file