这是我在调试或运行时收到的错误。
Stopped due to shared library event (no libraries added or removed)
Loaded '/lib64/ld-linux-x86-64.so.2'. Symbols loaded.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, main (argc=1, argv=0x7fffffffd8d8) at src/main.cpp:15
15 {
Loaded '/usr/local/lib/libSDL2-2.0.so.0'. Symbols loaded.
Loaded '/lib/x86_64-linux-gnu/libGL.so.1'. Symbols loaded.
这是Main.cpp:
// std
#include <stdio.h>
// opengl
#include <GL/glew.h>
// sdl
#include <SDL2/SDL.h>
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
int main(int argc, char* argv[])
{
// Initialize SDL
if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
fprintf(stderr, "SDL couldn't initialize\n");
return 1;
}
// @todo: implement createWindow method
// Create window
SDL_Window* window = SDL_CreateWindow(
"Title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
SCREEN_WIDTH, SCREEN_HEIGHT,
SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN
);
if(!window)
{
fprintf(stderr, "Error creating window\n");
return 2;
}
// SDL OpenGL settings
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
SDL_GL_SetAttribute(
SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE
);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
// SDL OpenGL context
SDL_GLContext glContext = SDL_GL_CreateContext(window);
// SDL v-sync
SDL_GL_SetSwapInterval(1);
// GLEW
glewInit();
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Game loop
bool quit = false;
while(quit == false)
{
SDL_Event windowEvent;
while(SDL_PollEvent(&windowEvent))
{
if(windowEvent.type == SDL_QUIT)
{
quit = true;
break;
}
}
// @todo: implement render method
// Render
SDL_GL_SwapWindow(window);
}
// @todo: encapsulate method
// Clean up
SDL_GL_DeleteContext(glContext);
return 0;
}
这是我的c_cpp_properties.json:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/include/GL",
"/usr/include/SDL2"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c17",
"cppStandard": "gnu++17",
"intelliSenseMode": "linux-gcc-x64",
"configurationProvider": "ms-vscode.makefile-tools"
}
],
"version": 4
}
这是我的launch.json:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/engine",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"additionalSOLibSearchPath": "/usr/local/lib",
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
}
]
}
这是我的tasks.json:
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-lSDL2",
"-lGL"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "compiler: /usr/bin/g++"
}
]
}
我尝试根据某些建议将
"additionalSOLibSearchPath": "/usr/local/lib",
添加到 launch.json,我还尝试了计算机上的其他库位置,包括 SDL2 的直接路径。
我将
"/usr/include/GL", "/usr/include/SDL2"
添加到 c_cpp_properties.json 文件的包含路径中
虽然这似乎只会改变智能感知。
我将
"-lSDL2", "-lGL"
添加到了tasks.json。
如果这有帮助,这是我的 MakeFile:
########################################################################
####################### Makefile Template ##############################
########################################################################
# Compiler settings - Can be customized.
CC = g++
CXXFLAGS = -std=c++11 -Wall -g
LDFLAGS = -lSDL2 -lGL -lGLEW
# Makefile settings - Can be customized.
APPNAME = engine
EXT = .cpp
SRCDIR = src
OBJDIR = obj
############## Do not change anything from here downwards! #############
SRC = $(wildcard $(SRCDIR)/*$(EXT))
OBJ = $(SRC:$(SRCDIR)/%$(EXT)=$(OBJDIR)/%.o)
DEP = $(OBJ:$(OBJDIR)/%.o=%.d)
# UNIX-based OS variables & settings
RM = rm
DELOBJ = $(OBJ)
# Windows OS variables & settings
DEL = del
EXE = .exe
WDELOBJ = $(SRC:$(SRCDIR)/%$(EXT)=$(OBJDIR)\\%.o)
########################################################################
####################### Targets beginning here #########################
########################################################################
all: $(APPNAME)
# Builds the app
$(APPNAME): $(OBJ)
$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
# Creates the dependecy rules
%.d: $(SRCDIR)/%$(EXT)
@$(CPP) $(CFLAGS) $< -MM -MT $(@:%.d=$(OBJDIR)/%.o) >$@
# Includes all .h files
-include $(DEP)
# Building rule for .o files and its .c/.cpp in combination with all .h
$(OBJDIR)/%.o: $(SRCDIR)/%$(EXT)
$(CC) $(CXXFLAGS) -o $@ -c $<
################### Cleaning rules for Unix-based OS ###################
# Cleans complete project
.PHONY: clean
clean:
$(RM) $(DELOBJ) $(DEP) $(APPNAME)
# Cleans only all files with the extension .d
.PHONY: cleandep
cleandep:
$(RM) $(DEP)
#################### Cleaning rules for Windows OS #####################
# Cleans complete project
.PHONY: cleanw
cleanw:
$(DEL) $(WDELOBJ) $(DEP) $(APPNAME)$(EXE)
# Cleans only all files with the extension .d
.PHONY: cleandepw
cleandepw:
$(DEL) $(DEP)
我还在 MakeFile 中添加了
CXXFLAGS = -std=c++11 -Wall -g
和 LDFLAGS = -lSDL2 -lGL -lGLEW
。
此停止不应该发生,因为默认情况下它是禁用的。查找 .gdbinit 文件并从其中删除
set stop-on-solib-events 1
或将其更改为 set stop-on-solib-events 0
。
更新launch.json:
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
},
{
"description": "Don't stop the target when a shared library is loaded or unloaded",
"text": "-gdb-set stop-on-solib-events 0",
"ignoreFailures": true
}
]