2009-11-02 44 views
1

由於某些原因,當使用發佈配置進行構建時,出現了有關「非dll-interface類」的警告,但未進行調試。帶有發佈配置的MySQL ++的編譯器警告

我已經比較了發佈和調試配置,以及我用MySQL ++示例的配置,但我不知道哪個設置導致了這些警告。從警告

1>c:\sql\mysql 5.0\mysql++-3.0.9\lib\qparms.h(49) : warning C4275: non dll-interface class 'std::_Container_base_aux' used as base for dll-interface class 'std::_Container_base_aux_alloc_real<_Alloc>' 
1>  with 
1>  [ 
1>   _Alloc=std::allocator<mysqlpp::SQLTypeAdapter> 
1>  ] 
1>  C:\apps\Microsoft Visual Studio 9.0\VC\include\xutility(377) : see declaration of 'std::_Container_base_aux' 
1>c:\sql\mysql 5.0\mysql++-3.0.9\lib\result.h(212) : warning C4275... 

代碼片段:

class MYSQLPP_EXPORT SQLQueryParms : public std::vector<SQLTypeAdapter> 
{ 
... 

給我最明顯的一點似乎是說我不使用CRT的DLL版本,但是因爲我(「多線程DLL(/ MD)」發佈)這是不能忽視的問題,所以一定在別處......

MYSQLPP_EXPORT被定義爲‘__declspec(dllexport)的’

編譯器命令行,我做了一些日。 e路徑的可讀性較短,但所有標誌等都是相同的。

/O2 /Oi /GL /I "C:\SQL\MySQL 5.0\\include\\" /I "C:\SQL\MySQL 5.0\mysql++-3.0.9\\lib\\" /D "NDEBUG" /D "_WIN32" /D "_MBCS" /FD /EHsc /MD /Gy /Yu"precompiled.h" /Fp"C:\...\server.pch" /Fo"C:\..." /Fd"C:\...\vc90.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt 

對於MySQL ++的例子。

/Od /I "C:\SQL\MySQL 5.0\\include" /I "..\lib" /D "_CONSOLE" /D "UNICODE" /D "_UNICODE" /FD /EHsc /MD /Fo"C:\SQL\MySQL 5.0\mysql++-3.0.9\vc2008\Release\simple1\\" /Fd"C:\SQL\MySQL 5.0\mysql++-3.0.9\vc2008\Release\simple1.pdb" /W3 /nologo /c /TP /errorReport:prompt 

回答

2

給我最明顯的事情似乎是我沒有使用 的CRT的DLL版本 ,但是因爲我 (「多線程DLL(/ MD)」爲 發佈)這是不能忽視的問題,所以 一定在別處......

1>c:\sql\mysql 5.0\mysql++-3.0.9\lib\qparms.h(49) : warning C4275: non dll-interface 

類 '的std :: _ Container_base_aux' 使用 作爲基地的dll接口類 「的std :: _ Container_base_ aux_alloc_real < _Alloc>」

這與代碼打交道時,我們與C4251一起安全地忽略警告,跨越邊界的DLL發送STL。這個警告讓你知道,如果其他的dll是用其他一些STL版本構建的(它不能算出來),那麼這個類的導入/導出版本之間的差異將會有所不同。

我知道你正在使用VS 2008,但MSDN似乎暗示,2005年您的具體情況可以忽略:

C4275可以在Microsoft忽視 的Visual C++ 2005,如果你是從衍生 標準C++ 庫中的類型,編譯調試版本 (/ MTd),編譯器錯誤 消息引用_Container_base。

公告中提及的「調試釋放」和_Container_base

+0

那麼,爲什麼發行下的警告,但沒有調試,有兩個同樣的警告級別? – 2009-11-02 19:35:40

+0

「注意到引用」調試版本「和_Container_base」嗯,我認爲,在這種情況下,在我看來,這對微軟來說是一個特別糟糕的設計選擇,如果有什麼調試應該更嚴格...... – 2009-11-04 16:49:54