程序入口点__gxx_personality_sj0不能位于…

我设法(以某种方式)与用于32位Windows的Mingw-w64项目编译器交叉编译Qt5。 所有的库已经安装到~/i686-w64-mingw32

我有一个基于CMake的Qt项目,我正在尝试交叉编译。 按照这些说明 ,我已经能够得到项目编译。 到现在为止还挺好。

不幸的是,当在Windows上执行结果二进制文件时,我最终得到一个错误:

“程序入口点__gxx_personality_sj0不能位于dynamic链接库[application_name] .exe中”

* [application_name]是主可执行文件的完整path

我听说这种types的问题有时可能是由混合不同版本的MinGW编译的库引起的。 但是这个机器上的所有东西(所有的库和可执行文件)都是由相同的编译器( i686-w64-mingw32工具链)编译的。

此外,我觉得奇怪的是,错误抱怨应用程序可执行文件丢失的入口点,而不是一个.dll文件。

什么可能导致这个错误,可以做些什么来弥补呢?

找到错误的库的位置:

  • 打开命令提示符。
  • 输入“libstdc ++ – 6.dll”并点击“Enter”
  • 一个消息框应该出现一个路径和一条消息: c:/ somefolder / someapp /…/ libstdc ++ – 6.dll 这个文件没有和它关联的程序等等, 路径就是答案。
  • 在IDE中运行应用程序:IDE中的%PATH%可能与命令提示符中的%PATH%不同(请参阅IDE设置)。 在这种情况下,将“libstdc ++ – 6.dll”放到一个批处理文件中,并从IDE中运行该批处理,应该显示出程序正在拾取的库的哪个特定实例。

我的个人解决方案

  • 打开“系统属性” – >“环境变量”(在我的情况下,在Windows 7中)并确保%PATH%变量(您的帐户和系统范围的变量%PATH%)以c:\ mingw开头\ bin(或者你为图书馆提供的任何路径)。 此外,您可能需要重新启动IDE才能启动新的PATH。

根据我的经验,MS Windows在%PATH%中选择位置的方式可能非常不稳定。 最后一次,我添加了一个单一函数的源文件,并将该函数包含在我的代码中。 即使我删除了所有函数的代码,只留下“return”语句,程序总会选择错误的libstdc ++ – 6.dll。 每次该功能被注释掉(排除),程序将再次正常运行。 我怀疑有时Windows会从“系统变量”中选择PATH,并由于某些原因避免“用户变量”PATH(您的Windows帐户的路径)。

最后,事实证明,这个问题是由$PATH libstdc++-6.dll地方的任意libstdc++-6.dll造成的。 在确保由Mingw-w64构建的副本在应用程序的目录中之后,一切正常。