2016-06-10 60 views
0

因此,我需要一個防篡改應用程序。 我已經完成了,但當我嘗試運行它在一個光禿禿的Windows 7虛擬機裏面,我有很多像msvcp140.dll等錯誤等丟失等 所以我搜索谷歌,以靜態鏈接這些。 我發現我應該改變它在項目代碼生成選項,所以我做到了。 我也有靜態鏈接的SFML。 問題是,我得到了很多的鏈接錯誤的指的SFML,如:(Visual Studio)嘗試將SFML庫與靜態鏈接庫時出現很多鏈接程序錯誤

sfml-system-s.lib(String.cpp.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease' in main.obj 

林不知道爲什麼會發生,所以我尋求幫助這裏

+0

最簡單的方式將與其他編譯器編譯只是它(見SFML網站上的說明),這樣就不需要那麼Visual Studio的編譯器要求那些Microsoft庫。或者只是將這些.dll文件與您的應用程序一起使用,假設您不僅限於可執行文件。 – Noctiphobia

+0

@Noctiphobia問題是我需要使用視覺工作室,因爲我的應用程序同時使用SFML和winapi(winapi用於定義如何sfml窗口看起來在這裏) 所以我需要使用visual studio 現在我只是覺得病重新編譯sfml使用cmake但我有一個編譯器沒有找到anc cxx編譯器沒有找到,我不知道爲什麼,但我會試圖找出 –

回答

0

我敢肯定我有你的問題想通通過閱讀錯誤信息,思考術語「RuntimeLibrary」,以及它如何說「DynamicRelease」和「StaticRelease」之間存在不匹配。我的直覺說,你正試圖將一個針對一個版本的CRT編譯的庫與一個針對不同版本的CRT的應用程序相結合。鑑於「MD」和「MT」是編譯器開關,它們分別控制您是動態連接還是靜態連接運行時,這也是一個很好的線索。

但只是可以肯定的是,我拿出了實際的錯誤代碼(LNK2038),並在the documentation中進行了查找。果然,它包含準確描述問題的一段話:

運行時庫

表示的二手通過一個應用程序或庫中的C++標準庫和C運行時的版本。使用一個版本的C++標準庫或C運行庫的代碼與使用不同版本的代碼不兼容。有關更多信息,請參見/MD, /MT, /LD (Use Run-Time Library)

多年來,鏈接器變得聰明起來。它試圖保護你免於犯嚴重錯誤。所有正在鏈接在一起的模塊都需要被編譯爲針對相同類型的運行時庫。如果您希望應用程序靜態鏈接到CRT(/ MT),則還需要靜態創建庫鏈接(/ MT)。
項目屬性→配置屬性→ C/C++ →代碼生成→運行時庫。
不要忘記重建所有。

+0

我不知道該怎麼辦,解釋有點不清楚。 –

+0

在項目屬性→配置屬性→C/C++→代碼生成→運行時庫我有/噸檢查,我使用SFML的靜態版本以及 –

+0

你必須改變*庫*編譯的方式,而不僅僅是應用程序。這是他們必須匹配的一點。 –