1. 程式人生 > >vs2013編譯google protobuf生成的訊息檔案錯誤。

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

啟用檢查的迭代器;迭代器除錯無關。