2009-11-02 7 views
1

Pour une raison quelconque, je reçois des avertissements à propos de "classe non dll-interface" lors de la construction avec une configuration de version, mais pas de débogage.Avertissements du compilateur avec MySQL ++ avec configuration de la version

J'ai comparé les configurations de version et de débogage, et celles avec les exemples MySQL ++, mais je ne vois pas quel paramètre est à l'origine de ces avertissements.

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

extrait de code de l'avertissement:

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

La chose évidente me semble que je ne suis pas en utilisant une version dll du tube cathodique, mais depuis que je suis ("Multi-thread DLL (/ MD) » pour la libération), ce ne peut pas être le problème, elle doit donc être un autre endroit ...

MYSQLPP_EXPORT est défini comme « __declspec (dllexport) »

ligne de commande du compilateur, j'ai fait quelques-uns des e e chemins plus courts pour la lisibilité, mais tous les drapeaux, etc sont les mêmes.

/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 

Et pour un exemple 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 

Répondre

2

La chose évidente me semble être que je ne suis pas en utilisant une version dll de le CRT, mais depuis que je suis ("DLL multi-thread (/ MD)" pour release) ce ne peut pas être le problème, donc doit être un autre endroit ...

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

classe 'std :: _ Container_base_aux' utilisé en tant que base pour la classe dll interface « std :: _ Container_base_ aux_alloc_real < _Alloc> »

Ceci est un avertissement que nous ignorons en toute sécurité avec C4251 en traitant avec le code qui envoie STL à travers les frontières de DLL. L'avertissement vous permet de savoir que si l'autre dll a été construit avec une autre version de STL (qu'il ne peut pas comprendre), l'empreinte de la classe va différer entre les versions importées/exportées de la classe.

Je sais que vous utilisez VS 2008, mais MSDN semble insinuer que pour 2005 votre situation exacte peut être ignoré en toute sécurité:

C4275 peut être ignorée dans Microsoft Visual C++ 2005 si vous dérivez de un type dans la bibliothèque Standard C++ , en compilant une version de débogage (/ MTd) et où le message d'erreur de compilation fait référence à _Container_base.

Notez la référence à la « version de débogage » et _Container_base

+0

Alors, pourquoi l'avertissement en liberté mais pas debug, il à la fois le même niveau d'avertissement? –

+0

"Notez la référence à" release debug "et _Container_base" hmm, je vois, ça me semble être un choix de design particulièrement mauvais de la part de Microsoft dans ce cas, si quelque chose de debug devrait être plus strict ... –

Questions connexes