【问题标题】:Compiler warnings with MySQL++ with release configuration带有发布配置的 MySQL++ 的编译器警告
【发布时间】:2009-11-02 19:19:51
【问题描述】:

由于某种原因,我在使用发布配置构建时收到了一些关于“非 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...

警告中的代码 sn-p:

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

【问题讨论】:

    标签: c++ mysql visual-studio-2008 visual-c++ mysql++


    【解决方案1】:

    对我来说显而易见的事情似乎是 我没有使用 dll 版本 CRT,但是因为我是 (“多线程 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 年的确切情况:

    C4275 在 Microsoft 中可以忽略 Visual C++ 2005(如果您正在派生) 来自标准 C++ 中的类型 库,编译调试版本 (/MTd) 以及编译器出错的地方 消息指的是_Container_base。

    注意对“调试版本”和 _Container_base 的引用

    【讨论】:

    • 那么为什么Release下的警告而不是debug,两者的警告级别相同?
    • “请注意对“调试版本”和 _Container_base 的引用,嗯,我明白了,在我看来,在这种情况下,如果任何调试应该更严格的话,这对微软来说是一个特别糟糕的设计选择。 ..
    猜你喜欢
    • 2021-11-17
    • 2012-10-17
    • 2014-04-13
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多