2013-02-15 38 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)。

相关问题