vs2013編譯google protobuf生成的訊息檔案錯誤。
用google protobuf 生成的.h 和.cpp放到工程目錄下,並新增好標頭檔案目錄和lib目錄,在main.cpp裡面新增
#pragma comment(lib,"libprotobuf.lib")//連結庫檔案
#pragma comment(lib,"libprotoc.lib")//連結庫檔案
之後,會發現編譯不過,具體就是
d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility(2132): error C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
然後從網上找到解決方案在訊息標頭檔案中新增
#ifndef _ITERATOR_DEBUG_LEVEL
#define _ITERATOR_DEBUG_LEVEL 0
#else
#undef _ITERATOR_DEBUG_LEVEL
#define _ITERATOR_DEBUG_LEVEL 0
#endif
後來發現還是有問題。
libprotobuf.lib(common.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '2' doesn't match value '0' in addressbook.pb.obj
lib裡面的obj的_ITERATOR_DEBUG_LEVEL 和訊息obj的_ITERATOR_DEBUG_LEVEL 不一樣,決定修改lib裡面的obj的_ITERATOR_DEBUG_LEVEL值。
開啟lib的工程,在 libprotobuf.lib 新增
Project Pages / Configuration Properties / C,C++ / Preprocessor / Preprocessor Definitions.
Add "_ITERATOR_DEBUG_LEVEL=0" in there worked.方可編譯通過。
_ITERATOR_DEBUG_LEVEL
編譯模式 |
新的巨集 |
舊巨集 |
描述 |
---|---|---|---|
除錯 |
|||
IDL=0 |
SCL=0,HID=0 |
禁用檢查的迭代器和禁用迭代器除錯。 |
|
IDL=1 |
SCL=1,HID=0 |
啟用檢查的迭代器和禁用迭代器除錯。 |
|
IDL=2 (預設值) |
SCL= (不適用),HID=1 |
預設情況下,啟用迭代器除錯;經過檢查的迭代器無關。 |
|
Release |
|||
IDL=0 (預設值) |
SCL=0 |
預設情況下,禁用檢查的迭代器。 |
|
IDL=1 |
SCL=1 |
啟用檢查的迭代器;迭代器除錯無關。 |