編輯:與投票結束時提到的問題不同,這裏的違規代碼是CRT代碼,而不是我的。即使它有問題(我很確定它沒有),但我無法確定它的來源。VC++:代碼在VS2010中工作,在VS2013中破解
我們有一個使用一些CRT內部一些舊的內存泄漏跟蹤代碼(沒有太奇特,基本上_CrtMemBlockHeader這是sort-of documented)。當試圖從VS2010遷移到VS2013的代碼似乎導致零星構建失敗,而有問題的部分,可以減少這樣:
#include <windows.h>
#define _CRTBLD
#include <..\crt\src\dbgint.h>
#include <fstream>
void Func()
{
std::ofstream myfile;
myfile << 8;
}
也就是說,僅這10條線建立在VS2010和VS2013罰款給:
C:\程序文件(86)\微軟的Visual Studio 12.0 \ VC \包括\ xlocnum(1105):錯誤C2491: '的std :: numpunct < _Elem> :: ID':dllimport的靜態數據的定義會員不允許
我懷疑錯誤消息是不準確的 - 有ID的確實幾個潛在的定義,他們都不在行1105也有警告相當滲出:
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocnum(1105): warning C4273: 'id' : inconsistent dll linkage
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocnum(80) : see previous definition of 'public: static std::locale::id std::numpunct<char>::id'
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocnum(80) : while compiling class template static data member 'std::locale::id std::numpunct<_Elem>::id'
1> with
1> [
1> _Elem=char
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocnum(1185) : see reference to function template instantiation 'const _Facet &std::use_facet<std::numpunct<_Elem>>(const std::locale &)' being compiled
1> with
1> [
1> _Facet=std::numpunct<char>
1> , _Elem=char
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocnum(1179) : while compiling class template member function 'std::ostreambuf_iterator<char,std::char_traits<char>> std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char>>>::do_put(_OutIt,std::ios_base &,_Elem,std::_Bool) const'
1> with
1> [
1> _OutIt=std::ostreambuf_iterator<char,std::char_traits<char>>
1> , _Elem=char
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\ostream(306) : see reference to class template instantiation 'std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char>>>' being compiled
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\ostream(292) : while compiling class template member function 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(int)'
1> c:\users\ofek\documents\visual studio 2013\projects\testcamsys2013\testcamsys2013\source.cpp(10) : see reference to function template instantiation 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(int)' being compiled
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\fstream(921) : see reference to class template instantiation 'std::basic_ostream<char,std::char_traits<char>>' being compiled
1> c:\users\ofek\documents\visual studio 2013\projects\testcamsys2013\testcamsys2013\source.cpp(9) : see reference to class template instantiation 'std::basic_ofstream<char,std::char_traits<char>>' being compiled
現在我粘貼的定義_CrtMemBlockHeader和它周圍的一些宏直接傳給我的代碼。但仍然 - 任何人都可以看到什麼打破了?
我意識到它沒有完全支持,但人們可以希望:是否有更強大的方法來使用_CrtMemBlockHeader?
......確保你擁有所有頭'#include'ed。VS2010自動'#include'頭,但VS2013並沒有這樣做。 – cybermonkey 2014-10-07 09:54:27
(1) VS2010/2013使用相同的設備來解析包含(使用不同的CRT頭文件夾),(2)錯誤本身不是'未定義符號'/'缺少類型說明符'等家族,所以 - 它不太可能成爲頭部包含問題。 – 2014-10-07 10:31:34
嘗試:http://stackoverflow.com/questions/8401359/c2491-stdnumpunct-elemid-definition-of-dllimport-static-data-member-n – cybermonkey 2014-10-07 11:53:21