尝试构建静态库时,MinGW-w64的ar.exe找不到库

时间:2012-10-04 08:35:55

标签: static-linking sfml ar mingw-w64

我现在一直试图让MinGW-w64在我的系统上工作好几天,主要是因为它有一个更新的GCC版本,但我要么设置错误或者MinGW-W64本身有一些奇怪的问题

我现在已经下载了i686-w64-mingw32-gcc-4.7.2-release-win32_rubenvb,将其解压缩到C:/Dev/mingw-ruben并将路径C:/Dev/mingw-ruben/bin添加到$ PATH环境变量。

我正在尝试构建的是SFML 2,它附带了一个CMake文件。运行CMake工作正常,编译器得到识别并通过所有测试。 CMake还在ar.exe文件夹中找到C:/Dev/mingw-ruben/bin。生成MinGW Makefile后,我切换到windows命令行并运行mingw32-make install。 问题出现了,我收到了错误:

mingw-ruben\bin\ar.exe: mingw-ruben/lib/libopengl32.a: No such file or directory

或者网络图书馆

mingw-ruben\bin\ar.exe: mingw-ruben/lib/libws2_32.a: No such file or directory

错误似乎很明显,在检查时libopengl32.a中确实没有libws2_32.amingw-ruben/lib/,但文件实际上位于C:/Dev/mingw-ruben/i686-w64-mingw32/lib

现在如何告诉ar / make / cmake不仅要在mingw-ruben/lib目录中搜索,还要在mingw-ruben/i686-w64-mingw32/lib中搜索?

i686-w64-mingw32子文件夹中的所有内容复制到mingw-ruben根文件夹是不是一个好主意?

作为旁注:我可以再次调用mingw32-make install并且程序将继续,但尝试将我的应用程序与SFML链接,我从内部遇到glXYZ函数的许多未解决的符号错误SFML。

更多信息:我使用的是Windows 8 x64,但我认为这并不重要,是的,我尝试过MSYS,但它无法解决我的任何问题。

我做错了吗?我必须特别配置一下吗?

2 个答案:

答案 0 :(得分:2)

2015年1月编辑

现在SFML 2.2已经发布,这不再是一个问题,你必须在链接静态时自己链接SFML的依赖项。

2014年1月编辑

从提交165f2b1888f784fe4c07开始,它包含在稳定版SFML 2.1中,支持MinGW-w64编译器。

然而,在与不同方面进一步讨论时,人们发现,sfml_static_add_libraries marco是一个相当丑陋的黑客。简而言之,它解压缩静态依赖项并将其obj文件包含在SFML库本身中。当尝试使用您自己的GLEW版本时,这是一个最明显的问题,因为SFML已经使用了它的内部版本,因​​此失败了。这个问题被带到了the forum并被推了很长一段时间,直到Laurent最后放弃并以正确的方式连接依赖关系,这意味着你必须自己将它们链接起来。

从提交dbf01a775b开始,其中包含在SFML 2.1的稳定版本中,当与SFML静态链接时,必须链接finally应用程序中的SFML依赖项。< / p>


<强>原始

在IRC上进行一些聊天之后,我们已经弄明白了。 它与MinGW无关,但这都是SFML的错。为了减少静态链接时SFML的依赖项列表,开发人员决定手动从每个库中提取符号(opengl32,ws2_32,...),这显然不是人们如何处理并违反某些ODR规则。然后发生实际错误,因为开发人员认为库将位于文件夹mingw/lib中,但是使用MinGW w64,它位于单独的目录mingw/version/lib中,因此ar.exe找不到库

<强>解决方案

删除对sfml_static_add_libraries宏的调用,然后重新编译。之后,你必须链接静态链接的所有依赖关系,就像它应该的那样。

答案 1 :(得分:1)

我认为这可能是你下载的gcc发行版的一个问题。

问题的一些亮点给出了ruben的问题:

https://unix.stackexchange.com/questions/45277/executing-binary-file-file-not-found

在我看来与此有关(虽然它是关于linux而不是赢)

几个月前,gcc 4.7.0 linux-&gt; win crosscompiler,我遇到了类似的问题(丢失文件的名称不同)。所以到现在为止我一直使用标准的ubuntu mingw-w64软件包,直到昨天我再次尝试了i686-w64-mingw32-gcc-4.7.2-release-linux64_rubenvb.tar.xz,它在其他相同的环境下工作没有问题以前的版本失败了“..ar.exe:...没有这样的文件”。有时我也在windows中开发,然后我使用http://www.mingw.org/,这对我来说更容易在Win中设置。它只支持32位目标,但对我的项目来说就足够了。