[英]Using sfml, calling window.close() gives: *** stack smashing detected ***: terminated
该程序运行良好,直到我添加了 Peca 类。 目前仍在运行,直到我调用 window.close()。 我安装了 sfml 2.5.1,我使用的是 Ubuntu 20.04。 删除对 Peca 类的所有引用消除了这个问题,删除 window.close() 也是如此。 我读到有多个版本的 sfml 可能会导致这种情况,但我似乎只有一个。
#include "Game.h"
int main(){
Game game;
game.run();
return 0;
}
#include "Game.h"
#define TIMEPERFRAME sf::seconds(1.f/60.f)
#define GAMENAME "game name"
Game::Game()
: window(sf::VideoMode(500,600),GAMENAME, sf::Style::Default),
peca()
{
}
void Game::update(sf::Time timePerFrame){
}
void Game::render(){
}
void Game::run(){
sf::Clock clock;
sf::Time elapsedSinceUpdate = sf::Time::Zero;
while(window.isOpen()){
processEvents();
elapsedSinceUpdate += clock.restart();
while(elapsedSinceUpdate > TIMEPERFRAME){
elapsedSinceUpdate -= TIMEPERFRAME;
processEvents();
update(TIMEPERFRAME);
}
render();
}
}
void Game::processEvents(){
sf::Event event;
while(window.pollEvent(event)){
if(event.type == sf::Event::Closed){
window.close();
}
}
}
#include "Peca.h"
Peca::Peca()
:tile(4)
{
tile.setPoint(0, sf::Vector2f(0, 0));
tile.setPoint(1, sf::Vector2f(20, 10));
tile.setPoint(2, sf::Vector2f(40, 0));
tile.setPoint(3, sf::Vector2f(20, -10));
}
sf::ConvexShape Peca::getTile(){
return tile;
}
标题:
#ifndef __GAME__
#define __GAME__
#include <SFML/Graphics.hpp>
#include "Peca.h"
class Game{
public:
Game();
void run();
private:
void processEvents();
void update(sf::Time timePerFrame);
void render();
sf::RenderWindow window;
Peca peca;
};
#endif
#ifndef __PECA__
#define __PECA__
#include <SFML/Graphics.hpp>
class Peca{
public:
Peca();
sf::ConvexShape getTile();
private:
sf::ConvexShape tile;
};
#endif
生成文件:
run: jogo
./jogo
jogo: jogo.o Game.o Peca.o
g++ jogo.o Game.o Peca.o -o jogo -lsfml-graphics -lsfml-window -lsfml-system
jogo.o: jogo.cpp
g++ -c jogo.cpp
Game.o: Game.cpp
g++ -c Game.cpp
Peca.o: Peca.cpp
g++ -c Peca.cpp
sfml 版本:
$ apt list libsfml-dev
libsfml-dev/focal,now 2.5.1+dfsg-1build1 amd64 [installed]
尝试使用 gdb 并得到这个:
Core was generated by `./jogo'.
Program terminated with signal SIGABRT, Aborted.
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
[Current thread is 1 (Thread 0x7feb93078680 (LWP 27482))]
(gdb) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1 0x00007feb9388d859 in __GI_abort () at abort.c:79
#2 0x00007feb938f83ee in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7feb93a2207c "*** %s ***: terminated\n") at ../sysdeps/posix/libc_fatal.c:155
#3 0x00007feb9399ab4a in __GI___fortify_fail (msg=msg@entry=0x7feb93a22064 "stack smashing detected") at fortify_fail.c:26
#4 0x00007feb9399ab16 in __stack_chk_fail () at stack_chk_fail.c:24
#5 0x000055e2081cf4f3 in main ()
首先我在 Windows 上,但在 wsl 上使用 ubuntu 进行了测试。
我停止使用 make 文件,因为我总是在其中出错,因此转移到 cmake。
我的 sfml 的 CMakeLists.txt 如下:
cmake_minimum_required(VERSION 3.16)
project(StackOverflow)
# Windows specific config
IF (WIN32)
# Include local sfml cmake config
set(SFML_DIR "${CMAKE_CURRENT_SOURCE_DIR}/SFML-2.5.1/lib/cmake/SFML")
# Link sfml statically (Optional)
set(SFML_STATIC_LIBRARIES TRUE)
ENDIF()
find_package(SFML 2.5.1 COMPONENTS graphics audio REQUIRED)
FILE(
GLOB
SOURCES
"src/*.cpp"
)
add_executable(StackOverflow ${SOURCES})
target_link_libraries(StackOverflow sfml-graphics sfml-audio)
target_include_directories(StackOverflow
PRIVATE
"${PROJECT_BINARY_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}/include"
)
目录是这样的
./
L include/
L game.h
L peca.h
L src/
L game.cpp
L peca.cpp
CMakeLists.txt
跑步
$ mkdir build
$ cd build
$ cmake ..
$ make
$ ./StackOverflow
运行没有错误
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.