1

何らかの理由で、リリース構成でビルドすると「非dllインターフェイスクラス」に関する警告が表示されますが、デバッグは行われません。

リリース構成とデバッグ構成、および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)」として定義されています

コンパイラのコマンドライン、読みやすくするためにいくつかのパスを短くしましたが、すべてのフラグなどは同じです。

/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
4

1 に答える 1

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>'

これは、DLLの境界を越えてSTLを送信するコードを処理するときに、C4251とともに安全に無視する警告です。警告は、他のdllが他のSTLバージョン(手元では理解できない)でビルドされた場合、クラスのフットプリントがクラスのインポート/エクスポートされたバージョン間で異なることを通知します。

VS 2008を使用していることは知っていますが、MSDNは、2005年の正確な状況は安全に無視できることを示唆しているようです。

標準C++ライブラリの型から派生し、デバッグリリース(/ MTd)をコンパイルし、コンパイラエラーメッセージが_Container_baseを参照している場合、Microsoft Visual C++2005ではC4275を無視できます。

「デバッグリリース」と_Container_baseへの参照に注意してください

于 2009-11-02T19:27:10.257 に答える