LNK2005:關於引用(std::string被繼承)出現的問題

今天在實現自己的地形生成小項目Terrain_Render的時候,爲了改寫代碼的組織結構,將data.h頭文件中的函數改寫到data.cpp文件中,發現在鏈接階段出現了報錯:

LNK2005
“class std::vector
<class std::basic_string<char,struct std::char_traits,class std::allocator >,class std::allocator
<class std::basic_string
<char,struct std::char_traits,
class std::allocator> > >
__cdecl str_split(class std::basic_string<char,
struct std::char_traits,
class std::allocator >,
class std::basic_string<char,
struct std::char_traits,
class std::allocator >)”
(?str_split@@YA?AV?
$vector@V?
$basic_string@DU?
$char_traits@D@std@@V?
$allocator@D@2@@std@@V?
$allocator@V?
$basic_string@DU?
$char_traits@D@std@@V?
$allocator@D@2@@std@@@2@@std@@V?
$basic_string@DU?
$char_traits@D@std@@V?
$allocator@D@2@@2@0@Z)
已經在 data.obj 中定義

經過檢查發現自己並沒有重複類型定義,而且自己的運行庫爲多線程調試 DLL (/MDd),通過查閱文檔發現解決方法:
在項目右擊選項屬性->配置屬性->鏈接器->命令行 加上一行” /FORCE:MULTIPLE “點擊” 應用“就解決了
簡單說就是VS的的STL從import變成static了
暫時不明白副作用是什麼,待查閱文檔

這一問題的原因是由於導入的動態鏈接庫中,定義了從std::string派生的類。參見:http://social.msdn.microsoft.com/Forums/vstudio/en-US/9ec13f84-0396-4078-be2c-2448dc4eef8b/lnk-2005-error-with-dll-in-msvc-10-class-derived-from-stdstring?forum=vcgeneral

對於這一問題,微軟工程師給出的建議是,將繼承改爲組合,卻沒有說明引發鏈接錯誤的根本原因。可能在自己導入的某個庫中派生了std::string的類。

參考閱讀:
由std::string繼承引起的LNK 2005錯誤
靜態鏈接和動態鏈接庫混用導致的鏈接錯誤LINK2005

題外話: Project->C/C+±>Code Generation->Runtime Library 這個選項,我們調用的lib和主程序exe裏的選擇不一致,也會產生類似的錯誤,並誤認爲是STL衝突。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章