所以4251警告至少是微软编译器的重要基础。基本上,只要您在标头定义中的任何位置使用模板类或非dllexport类,就会收到此警告。更好的是,stl中有许多类(如map),你甚至无法摆脱这个错误,句号。
我的问题是,对于特定的类,“#pragma warning(disable:4251)”只是扁平化不起作用。它在其他地方工作,但在这里。
DelWestInspectionProgram.cpp
#include "stdafx.h"
#pragma warning(disable: 4251)
...
Output Log:
E:\svn\VisionNow\VisionSuite\VI.Inspector.ImageProcessing.Common\BIImage.h(79): warning C4251: 'BIImage::_data' : class 'boost::shared_array<T>' needs to have dll-interface to be used by clients of class 'BIImage'
6> with
6> [
6> T=unsigned char
6> ]
6>E:\svn\VisionNow\VisionSuite\VI.Inspector.ImageProcessing.Operators\BIImageOperator.h(25): warning C4251: 'BIImageOperator::_savePath' : class 'std::basic_string<_Elem,_Traits,_Ax>' needs to have dll-interface to be used by clients of class 'BIImageOperator'
6> with
6> [
6> _Elem=char,
6> _Traits=std::char_traits<char>,
6> _Ax=std::allocator<char>
6> ]
非常感谢任何帮助。
答案 0 :(得分:2)
根据我自己的经验,有两个问题:当它是DLL导入时以及它是DLL导出时。
在dllexport中,Microsoft似乎忽略了#pragma警告,但这只是一个很容易放入编译器设置以忽略此警告的项目。我发现如果你把它放在那里,微软不会发出警告。
它是dllimport,即使用标题的文件。我发现Microsoft没有忽略该pragma并且没有发出警告,因此将它放在两个位置都可以解决您的问题。
我的猜测是,79个禁止警告的项目是那些不是DLL本身的项目。
答案 1 :(得分:0)
据我所知,有些错误无法被禁用。链接器就是这样。因此我认为它与某些编译器的方式相同。但总的来说,我会将它放在你的stdafx.h文件中,或者至少在它之前。把它放在后面并不保证任何东西,特别是因为我们看不到你的代码。
[编辑]
另一方面,这是一个严重的警告,如果我是你,我会解决,而不是忽略它。如果你在这里搜索堆栈溢出,你会发现一些很好的讨论,为什么它是一个问题。