質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1308閲覧

glGenVertexArrays(1, &vao); 関数でSegmentation fault (コアダンプ)というセングメンテーションエラーが発生する原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/02/01 10:48

編集2022/02/01 13:02

提示コードですが以下のメイクファイルを実行すると下記のコンソールのエラーが表示されるのですがこれは何が原因なのでしょうか?
デバッガで調べましたが見て通りSprite.cpp 29行目が悪いみたいななのですが原因わかりません。///コメント部参照

試したこと

Main.cppのEntryクラスや初期化関係の関数をコメントアウトして実験

参考サイト: https://www.toumasu-program.net/entry/2019/05/24/112315/

makefile

makefile

1PRG :=Game 2SRC_DIR :=FrameWork/source 3SRC_USE_DIR :=source 4 5OBJ_DIR :=FrameWork/object 6OBJ_USE_DIR :=object 7 8DEP_DIR :=FrameWork/object 9DEP :=$(wildcard $(DEP_DIR)/*.d) 10 11SRC :=$(wildcard $(SRC_DIR)/*.cpp) 12SRC_USE :=$(wildcard $(SRC_USE_DIR)/*.cpp) 13 14OBJ :=$(addprefix $(OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC)))) 15OBJ_USE :=$(addprefix $(OBJ_USE_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC_USE)))) 16 17$(PRG): $(OBJ) $(OBJ_USE) 18 $(CXX) $^ -o $@ -ldl -lGLESv2 -lGLU -lGL -lglfw3 -pthread -lGL -lGLEW -lfreetype -ldl -lX11 19 20$(OBJ_DIR)/%.o: FrameWork/source/%.cpp 21 $(CXX) -g -c -MMD -MP $< -o $@ 22-include $(DEP) 23 24$(OBJ_USE_DIR)/%.o: source/%.cpp 25 $(CXX) -g -c -MMD -MP $< -o $@ 26-include $(DEP) 27 28clean: 29 rm -f ./$(OBJ_USE_DIR)/*.o ./$(OBJ_DIR)/*.o *.out ./$(OBJ_DIR)/*.d ./$(OBJ_USE_DIR)/*.d $(PRG) 30
Console debug
Reading symbols from ./Game... (gdb) run Starting program: /home/shigurechan/prg/TopDownGame/Game [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". Program received signal SIGSEGV, Segmentation fault. 0x0000000000000000 in ?? () (gdb) bt #0 0x0000000000000000 in ?? () #1 0x0000555555563ff3 in FrameWork::Sprite::Sprite (this=0x55555563f9c0) at FrameWork/source/Sprite.cpp:29
Main.cpp
#include <iostream> #include "../FrameWork/FrameWork/FrameWork.hpp" #include "../header/Entry.hpp" int main() { if (glfwInit() == GL_FALSE) { std::cerr << "glfw を初期化出来ません。" << std::endl; assert(0); } int screenSize = 50; std::shared_ptr<FrameWork::Window> window = FrameWork::GenWindowContext(glm::ivec2(16 * screenSize, 9 * screenSize), "Game"); FrameWork::setCurrentContext(window); if (glewInit() != GLEW_OK) { std::cerr << "glew を初期化出来ません。" << std::endl; assert(0); } FrameWork::Init_FrameWork(); std::unique_ptr<Entry> entry = std::make_unique<Entry>(); while (*window) { entry->Loop(); window->SwapBuffers(); } return 0; }
Console
$ ./Game Segmentation fault (コアダンプ)
Srpite.cpp

cpp

1#include "../header/Sprite.hpp" 2 3#include <array> 4#include <memory> 5 6#include <GL/glew.h> 7#include <glm/glm.hpp> 8#include <glm/gtc/type_ptr.hpp> 9#include <glm/gtc/quaternion.hpp> 10#include <glm/gtc/type_ptr.hpp> 11#include <glm/gtx/transform.hpp> 12#include <glm/gtc/matrix_transform.hpp> 13 14#include "../header/Resource.hpp" 15#include "../header/Shader.hpp" 16#include "../header/Vertex.hpp" 17#include "../header/Sprite.hpp" 18#include "../header/Shader.hpp" 19#include "../header/Window.hpp" 20#include "../header/Init.hpp" 21 22 23 24FrameWork::Sprite::Sprite() : Render() 25{ 26 vao = 0; 27 vbo = 0; 28////////////////////////////////////////////////////////////////// 29 glGenVertexArrays(1, &vao); 30//////////////////////////////////////////////////////////////// 31 glGenBuffers(1, &vbo); 32 33 34 35 glBindVertexArray(vao); 36 glBindBuffer(GL_ARRAY_BUFFER, vbo); 37 38 shader->setEnable(); 39 40 glBufferData(GL_ARRAY_BUFFER, vertex.size() * sizeof(VertexAttributeSprite), (float*)vertex.data(), GL_DYNAMIC_DRAW); 41 42 GLuint attrib = shader->getAttribLocation("vertexPosition"); 43 glEnableVertexAttribArray(attrib); 44 glVertexAttribPointer(attrib, 3, GL_FLOAT, GL_FALSE, (sizeof(VertexAttributeSprite) / sizeof(float)) * sizeof(float), (GLvoid*)(sizeof(GLfloat) * 0)); 45 shader->setBindAttribLocation("vertexPosition"); 46 47 attrib = shader->getAttribLocation("vertexUV"); 48 glEnableVertexAttribArray(attrib); 49 glVertexAttribPointer(attrib, 3, GL_FLOAT, GL_FALSE, (sizeof(VertexAttributeSprite) / sizeof(float)) * sizeof(float), (GLvoid*)(sizeof(GLfloat) * 3)); 50 shader->setBindAttribLocation("vertexUV"); 51 52 shader->setDisable(); 53 glBindVertexArray(0); 54 glBindBuffer(GL_ARRAY_BUFFER, 0); 55 56} 57 58// ##################################### 描画 ##################################### 59void FrameWork::Sprite::Renderer(const glm::mat4 view,const FrameWork::Texture texture,const glm::vec3 position,const glm::ivec2 startSize,const glm::ivec2 endSize) 60{ 61 setSize(startSize,endSize); 62 setUV(startSize, endSize,texture.size); 63 64 glBindVertexArray(vao); 65 glBindBuffer(GL_ARRAY_BUFFER, vbo); 66 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VertexAttributeSprite) * vertex.size(), vertex.data()); 67 68 Transform::setPosition(position); 69 Transform::setRotate(glm::vec3(0, 0, 1), 0); 70 Transform::setScale(glm::vec3(endSize - startSize,1)); 71 72 shader->setUniformSampler2D("uImage",0,texture.ID); 73 shader->setUniformMatrix4fv("uTranslate", Transform::getMatTranslation()); 74 shader->setUniformMatrix4fv("uRotate", Transform::getMatRotate()); 75 shader->setUniformMatrix4fv("uScale", Transform::getMatScale()); 76 shader->setUniformMatrix4fv("uViewProjection", view); 77 78 glDrawArrays(GL_TRIANGLES,0,6); 79 80 glBindVertexArray(0); 81 glBindBuffer(GL_ARRAY_BUFFER, 0); 82} 83 84
Sprite.hpp

cpp

1# 2 3/*######################################################################### 4# スプライトクラス 5説明 6 2Dのテクスチャ描画 正射形 7###########################################################################*/ 8 9/*######################################################################### 10*NOTE 11* 12* 頂点の順番 13* 0 2,3 14* 1,4 5 15###########################################################################*/ 16 17 18namespace FrameWork 19{ 20 21 22 class Sprite : public Render 23 { 24 public: 25 26 Sprite(); 27 ~Sprite(); 28 29 void Renderer(const glm::mat4 view, const FrameWork::Texture texture,const glm::vec3 position, const glm::ivec2 startSize, const glm::ivec2 endSize); 30 void Renderer_Rotate(const glm::mat4 view, const glm::vec3 position, const glm::ivec2 startSize, const glm::ivec2 endSize,const glm::ivec2 textureSize, const glm::vec3 rotate, const float radian); 31 32 std::shared_ptr<FrameWork::Shader> shader; 33 34 private: 35 36 GLuint vao; 37 GLuint vbo; 38 39 std::array<VertexAttribute, 6> vertex; 40 41 void setSize(const glm::vec2 startSize, const glm::vec2 endSize); 42 void setUV(const glm::vec2 startSize, const glm::vec2 endSize, const glm::ivec2 textureSize); 43 44 45 }; 46} 47#endif

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itagagaki

2022/02/01 11:47

デバッガは使わないのですか
退会済みユーザー

退会済みユーザー

2022/02/01 11:48

これはコマンドラインなのですが
episteme

2022/02/01 11:54

いやだから、コマンドラインで起こっているトラブルの原因をデバッガで追及しないのですか?
退会済みユーザー

退会済みユーザー

2022/02/01 11:55

失礼しました。デバッグ情報を追記しました。
episteme

2022/02/01 12:04

コンパイル時にdebug-option付けてないの?
退会済みユーザー

退会済みユーザー

2022/02/01 12:06

-g3 というオプションをつけました
episteme

2022/02/01 12:11

Makefile内 に -g3 が見当たりませんけど。
退会済みユーザー

退会済みユーザー

2022/02/01 12:15

今、編集しました。
int32_t

2022/02/01 12:28

-g を付けてビルドし直して、gdb 内で SIGSEGV させたら、その直後に gdb 内のまま bt を実行しましょう。
退会済みユーザー

退会済みユーザー

2022/02/01 12:38

表示されました。
guest

回答1

0

ベストアンサー

Program received signal SIGSEGV, Segmentation fault. 0x0000000000000000 in ?? () (gdb) bt #0 0x0000000000000000 in ?? () #1 0x0000555555563ff3 in FrameWork::Sprite::Sprite (this=0x55555563f9c0) at FrameWork/source/Sprite.cpp:29

見ての通りで、Sprite.cpp の29行目でクラッシュしてます。そのへんのコードを精査したり、その直前からステップ実行して状況を調べましょう。

投稿2022/02/01 12:45

int32_t

総合スコア20878

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/02/01 13:02

質問ですがint main関数をすべてコメントアウトしても同じエラーが出るのですがこれはどういうことなのでしょうか?
int32_t

2022/02/01 13:06 編集

main()に入る前にクラッシュしているということです。グローバル変数やstaticデータメンバの初期化とか。 btの結果の中に、どこの変数なのかの情報が含まれているはずです。
退会済みユーザー

退会済みユーザー

2022/02/01 13:13 編集

誤投稿です
int32_t

2022/02/01 13:16

当てずっぽですが、OpenGLを初期化するより前に glGenVertexArrays() を呼んではいけないんじゃないでしょうか。
退会済みユーザー

退会済みユーザー

2022/02/03 03:04

いえstaitc 変数をopenglの初期化前に初期化していました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問