【发布时间】:2020-08-25 17:41:34
【问题描述】:
我一直在使用 SFML 开发一款游戏,并且在我的 Linux 和 Mac 机器上运行它的效果非常好。最近尝试在Windows上编译游戏,遇到了很多问题。
我正在使用 g++ 和 makefile。
g++ -std=c++17 -g -O2 -Wall -Wno-reorder -LSFML-2.5.1/lib -ISFML-2.5.1/include -o dungy Animation.o Camera.o Dust.o DustParticle.o Entity.o Game.o main.o Player.o PlayerTrail.o Room.o Textures.o Tile.o -lsfml-graphics -lsfml-audio -lsfml-window -lsfml-system
当我运行 make 时,我得到了大量这样的未定义引用(链接到下面的完整输出):
Animation.o: In function `Animation::Animation(sf::Sprite*, int, bool)':
C:\Users\foxhu\Documents\Programming\C++\dungy/Animation.cpp:9: undefined reference to `__imp__ZNK2sf6Sprite15getGlobalBoundsEv'
C:\Users\foxhu\Documents\Programming\C++\dungy/SFML-2.5.1/include/SFML/Graphics/RectangleShape.hpp:41: undefined reference to `__imp__ZN2sf5ShapeD2Ev'
使用 Visual Studio [完全按照 SFML 网站的教程] 时会输出类似的错误,但它主要由随机字符组成。
Here's a link to the full output including the g++ command
我正在使用最新的 SFML 版本,并且过去曾使用 g++ 使用几乎完全相同的 makefile 编译游戏,所以我对为什么这不起作用并且在网上找不到任何帮助我感到目瞪口呆经过数小时的寻找并尝试解决此问题。该游戏使用 g++ 和相同的 makefile 在 Mac 和 Linux 上完美运行
最后一件事是 SFML 网站说确保编译器版本 100% 匹配,我下载了他们为 MinGW 7.3.0(32 位)提供的版本并下载了正确的 SFML版本匹配。
编辑:
Here's 如果出于某种原因需要完整的 makefile
【问题讨论】:
-
嗯,从错误消息中可以清楚地看出,未定义的引用是对名为 Sprite 的类的名为 getGlobalBounds 的函数。这是一个 SFML 函数,因此您没有正确链接 SFML 库。这不是编译问题,而是链接器问题。
-
在开发后期避免出现此类意外的一条建议:始终设置持续集成 (CI) 系统,从一开始就自动构建您在所有相关平台上所做的每一次提交。
-
@john 这就是为什么我很困惑,因为这正是它“应该”的样子(据我所知,没有人说过任何不同),我什至有所需的确切 g++ 版本以及我在 SFML 论坛上准确地链接了我过去的工作方式以及人们如何做到这一点。
-
@JesperJuhl 我以后一定要试试
-
@HKVariant 32 位与 64 位冲突总是有可能发生
标签: c++ linux makefile g++ sfml