Предупреждения компилятора с MySQL ++ с конфигурацией выпуска - PullRequest
1 голос
/ 02 ноября 2009

По какой-то причине я получаю некоторые предупреждения о «не-dll-interface class» при сборке с конфигурацией выпуска, но не при отладке.

Я сравнил конфигурации выпуска и отладки, а также мои конфигурации с примерами 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>
{
...

Мне кажется очевидным, что я не использую dll-версию CRT, однако, поскольку я («Многопоточная 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

1 Ответ

2 голосов
/ 02 ноября 2009

Кажется очевидным, что что я не использую версию 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-интерфейса 'Станд :: _ Container_base_aux_alloc_real <_Alloc>'

Это предупреждение, которое мы игнорируем безопасно вместе с C4251 при работе с кодом, который отправляет STL через границы DLL. Предупреждение дает вам знать, что если другая dll была построена с какой-либо другой версией STL (которую он не может выяснить вручную), то, чем занимаемая площадь класса будет отличаться между импортированными / экспортированными версиями класса.

Я знаю, что вы используете VS 2008, но MSDN , похоже, намекает на то, что в 2005 году вашу точную ситуацию можно смело игнорировать:

C4275 можно игнорировать в Microsoft Visual C ++ 2005, если вы производите из вида в стандарте C ++ Библиотека, компилирующая отладочную версию (/ MTd) и где ошибка компилятора сообщение ссылается на _Container_base.

Обратите внимание на ссылку "debug release" и _Container_base

...