2014-10-07 77 views
1

編輯:與投票結束時提到的問題不同,這裏的違規代碼是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?

+0

......確保你擁有所有頭'#include'ed。VS2010自動'#include'頭,但VS2013並沒有這樣做。 – cybermonkey 2014-10-07 09:54:27

+0

(1) VS2010/2013使用相同的設備來解析包含(使用不同的CRT頭文件夾),(2)錯誤本身不是'未定義符號'/'缺少類型說明符'等家族,所以 - 它不太可能成爲頭部包含問題。 – 2014-10-07 10:31:34

+0

嘗試:http://stackoverflow.com/questions/8401359/c2491-stdnumpunct-elemid-definition-of-dllimport-static-data-member-n – cybermonkey 2014-10-07 11:53:21

回答

2

看着我的系統上的這個錯誤,它似乎只與#define _CRTBLDfstream標題有關。附帶dbgint.h是無關緊要的(你可以註釋掉#include,仍然得到同樣的錯誤

所以,這似乎是在fstream頭一個問題改變夾雜物的順序刪除編譯錯誤:。

#include <windows.h> 
#include <fstream> 

#define _CRTBLD 
#include <..\crt\src\dbgint.h> 

也許這可以幫助我以前來過這裏嗎?

+0

我剛纔看到我原來的評論沒有出現 - 謝謝,這或多或少是我最終使用的解決方案。我沒有更改包含順序,而是在包含dbgint後立即#undef'd _CRTBLD。 – 2014-11-05 13:31:35

相關問題