2016-09-29 30 views
0

我遇到同樣的問題,因爲這裏所說的發現: Protobuf - Refuses to link vs2013 or vs2015`__declspec(dllexport)的EXTERN的std :: string foo的;`不連接

我想通了,這兩條線在generated_message_util.h可能造成這個問題:

__declspec(dllexport) extern const ::std::string* empty_string_; 
__declspec(dllexport) extern ProtobufOnceType empty_string_once_init_; 

參見:https://github.com/google/protobuf/blob/master/src/google/protobuf/generated_message_util.h#L80

我沒有那麼細化熟悉的關鍵字extern,但最後爲L試圖使用該libarary的inker無法找到這些變量的兩個定義,這些變量在generated_message_util.cc中完成。

const ::std::string* empty_string_; 
GOOGLE_PROTOBUF_DECLARE_ONCE(empty_string_once_init_); 

void InitEmptyString() { 
    empty_string_ = new string; 
    ... 
} 

參見:https://github.com/google/protobuf/blob/master/src/google/protobuf/generated_message_util.cc#L51和以下行。

有人知道這個問題有一個很好的解決方法,有這些信息嗎?

回答

0

確保您的編譯器標誌和定義的預處理器符號設置正確。

__declspec(dllexport)應該設置爲創建DLL,並且您的代碼需要包含定義。如果你想使用DLL,那麼你需要__declspec(dllimport)

有關LIBPROTOBUF_EXPORT的定義,請參閱port.h文件(src/google/protobuf/stubs/port.h)。這取決於LIBPROTOBUF_EXPORTS,所以如果你想創建該DLL,請確保LIBPROTOBUF_EXPORTS定義。如果你想使用這個DLL,請確保LIBPROTOBUF_EXPORTS不是定義的。

爲了找出這個問題,你可以在你的項目中插入下面的代碼:

#ifdef LIBPROTOBUF_EXPORTS 
#error defining LIBPROTOBUF_EXPORTS only allowed on DLL creation! 
#endif 

#ifndef PROTOBUF_USE_DLLS 
#error defining PROTOBUF_USE_DLLS is required for DLL usage! 
#endif 

這將導致一個編譯錯誤,如果你的符號被錯誤定義。然後你仍然需要修復你的項目設置,直到滿足條件。鑑於目前的信息,我無法幫助您。

如果條件不會觸發錯誤並且問題仍然存在,則可能還有其他事情正在進行,值得深入研究。

+0

固定。最初有反向描述... – grek40

+0

'LIBPROTOBUF_EXPORTS'和 'PROTOBUF_USE_DLLS'是在庫項目預處理器設置中定義的。使用這個lib的應用程序沒有定義它們。 –

+0

@MatthiasLochbrunner那麼你的問題標題沒什麼意義......除非定義了「PROTOBUF_USE_DLLS」和「LIBPROTOBUF_EXPORTS」,否則'LIBPROTOBUF_EXPORT'不應該展開爲'__declspec(dllexport)'。請重新檢查。 – grek40

相關問題