2013-02-15 62 views
17

我設法(以某種方式)與用於32位Windows的Mingw-w64項目編譯器交叉編譯Qt5。所有的庫已安裝到~/i686-w64-mingw32程序入口點__gxx_personality_sj0不能位於...

我有一個基於CMake的Qt項目,我試圖交叉編譯。通過遵循these instructions,我已經能夠讓項目編譯。到現在爲止還挺好。

不幸的是,執行在Windows上生成的二進制文件的時候,我最終得到一個錯誤:

"The procedure entry point __gxx_personality_sj0 could not be located in the dynamic link library [application_name].exe"

* [應用程序名稱]是將主可執行文件的完整路徑

我聽說這種類型的問題有時可能是由混合使用不同版本的MinGW編譯的庫引起的。但是這臺機器上的所有東西(所有的庫和可執行文件)都是由同一個編譯器編譯的(i686-w64-mingw32工具鏈)。

此外,我覺得奇怪的是,錯誤抱怨應用程序可執行文件丟失的入口點而不是.dll文件之一。

什麼可能導致此錯誤,以及可以採取哪些措施來糾正它?

+0

也許你正在使用以不同版本編譯的軟件 – didierc 2013-02-15 06:44:05

+0

@didierc:我只安裝了一個版本的Mingw-w64。 – 2013-02-15 07:38:56

+0

我想知道如果你有一個用不同版本的mingw編譯的軟件,而不是你使用過不同版本的mingw。你的回答完全反映了我的假設,即某個地方的另一個軟件正在使用由不同版本生成的庫,並且它以某種方式與你的編譯軟件進行交互。我想我沒有把事情說得夠好,但你知道了,向你表示讚美! – didierc 2013-02-15 14:13:18

回答

11

最後,事實證明,這個問題是由於在$PATH的某處libstdc++-6.dll的任性而導致的。在確保由Mingw-w64構建的副本位於應用程序的目錄中之後,一切正常。

+1

謝謝!我有一個錯誤「程序入口點__gxx_personality_sj0不能位於動態鏈接庫libstdC++ - 6.dll」,並且重命名「c:\ Windows \ SysWOW64 \ libstdC++ - 6.dll」工作! – 2013-04-23 17:50:07

+1

在構建源代碼之前運行'where libstdC++ - 6.dll'是很方便的。在我的情況下,我在我的PATH變量中安裝了Anaconda安裝,然後mingw進入。 – 2015-08-08 18:34:06

+0

我從Windows目錄中刪除了DLL,它工作。也就是說,這可能不是我想通過電話向人們提供的說明,讓我的程序在他們的計算機O.o上工作。哦,DLL地獄... – Dmitry 2016-04-06 11:18:21

15

發現錯誤的庫中的位置:

  • 打開命令提示符。
  • 類型 「的libstdC++ - 6.dll」 並按下 「回車」
  • 一個消息框應該用路徑和消息出現:C:/ somefolder/someapp /.../的libstdC++ - 6.dll此文件沒有與之關聯的程序...等等。 路徑就是答案。
  • 從IDE中運行您的應用程序:IDE中的%PATH%可能是 與命令提示符中的%PATH%不同(請參閱IDE設置)。在 這種情況下,將「libstdC++ - 6.dll」放入批處理文件並運行 ,IDE內的批處理應該顯示程序正在拾取的庫的哪個特定實例 。

我個人的解決方案:

  • 打開 「系統屬性」 - > 「環境變量」(在Windows 7中,在我的情況),並確保兩者%PATH%變量(一個對於你的賬戶和系統範圍的變量%PATH%)以c:\ mingw \ bin(或者你對圖書館有的任何路徑)開頭。此外,您可能必須重新啓動IDE才能獲取新的PATH。

以我的經驗,選擇%PATH%中的位置的MS Windows的方式可以是非常不穩定的。上次,我用一個函數添加了一個源文件,並將該函數包含在我的代碼中。即使我刪除了所有函數的代碼,並且只保留了'return'語句,該程序也會始終選擇錯誤的libstdC++ - 6.dll。每次該功能被註釋掉(排除),該程序將再次正常運行。我懷疑有時Windows會從「系統變量」中選擇PATH,並由於某種原因避免「用戶變量」PATH(您的Windows帳戶的PATH)。

相關問題