我正在尝试按照教程创建一个空白窗口,可以使用 Esc 按钮关闭该窗口,但该窗口从未显示。这是在运行 Ubuntu 20.05.6 的 WSL 上。代码编译并运行...
我正在尝试按照教程创建一个空白窗口,可以使用 Esc 按钮关闭该窗口,但该窗口从未显示。这是在运行 Ubuntu 20.05.6 的 WSL 上
代码编译并运行没有错误,但一旦运行它实际上什么也没做。任务栏上没有图标或类似的东西。
#include <SDL2/SDL.h>
#ifndef GAME_H
#define GAME_H
class Game
{
public:
Game();
bool Initialize();
void RunLoop();
void Shutdown();
private:
void ProcessInput();
void UpdateGame();
void GenerateOutput();
SDL_Window* mWindow;
bool mIsRunning;
};
#endif
Game.h - 这是包含函数声明的头文件
#include "Game.h"
#include <iostream>
Game::Game() {
this->mWindow = nullptr;
this->mIsRunning = true;
}
bool Game::Initialize() {
int sdlResult = SDL_Init(SDL_INIT_VIDEO);
if(sdlResult != 0) {
SDL_Log("Unable to initialize SDL: %s", SDL_GetError());
return false;
}
mWindow = SDL_CreateWindow(
"Test",
100,
100,
1024,
768,
SDL_WINDOW_SHOWN
);
if(!mWindow) {
SDL_Log("Failed to create window: %s", SDL_GetError());
}
return true;
}
void Game::Shutdown() {
SDL_DestroyWindow(mWindow);
SDL_Quit();
}
void Game::RunLoop() {
while(mIsRunning) {
ProcessInput();
UpdateGame();
GenerateOutput();
}
}
void Game::ProcessInput() {
SDL_Event event;
while (SDL_PollEvent(&event)) {
switch(event.type) {
case SDL_QUIT:
mIsRunning = false;
break;
}
}
const Uint8* state = SDL_GetKeyboardState(NULL);
if (state[SDL_SCANCODE_ESCAPE]) {
mIsRunning = false;
}
}
void Game::UpdateGame() {}
void Game::GenerateOutput() {}
int main (int argc, char** argv) {
Game game;
bool success = game.Initialize();
if(success) {
std::cout << SDL_GetError() << std::endl;
game.RunLoop();
}
game.Shutdown();
return 0;
}
Game.cpp - 这是 Game 类的实现。UpdateGame() 和 GenerateOutput() 都是空的,因为我在本教程中还没有讲到这一步。
代码没有输出 Initialize() 方法中的任何错误消息,因此我假设窗口已创建但未显示。最初,我还没有实现 ProcessInput() 方法,但此站点上的其他问题已通过添加事件循环得到解决,因此我也这样做了,但这并没有改变任何东西。有一个错误指出“未知像素格式”,但在运行调试器后,我将其追溯到一个 SDL 函数,该函数创建一个虚拟鼠标光标并调用一个带有参数的函数,这些参数将始终导致它失败,因此我认为它不相关。
编辑:当我在 Windows 而不是 WSL 中编译并运行它时,窗口就会出现。我确实必须在 Game.h 中定义 SDL_MAIN_HANDLED,我相信这与覆盖 WinMain() 有关
当我尝试在 Ubuntu 22.04.3 LTS(Jammy Jellyfish)中编译本机 C# 库时出现此错误,它在 20.4 中并不存在。使用的命令是;dotnet publish -r linux-x64 -c Release -p:PublishAo...
当我尝试在 Ubuntu 22.04.3 LTS(Jammy Jellyfish)中编译本机 C# 库时出现此错误,因为它在 20.4 中并不存在。
使用的命令; dotnet publish -r linux-x64 -c Release -p:PublishAot=true
错误;
/usr/bin/ld.bfd:找不到 -lz:没有此文件或目录
collect2:错误:ld 返回 1 退出状态 [test.csproj]/root/.nuget/packages/microsoft.dotnet.ilcompiler/8.0.2/build/Microsoft.NETCore.Native.targets(367,5):error MSB3073:命令 \'\'gcc\' \'test.o\' -o \'test.so\'-Wl,--version-script=obj/Release/net8.0/linux-x64/native/test.exports -Wl,--export-dynamic -gz=zlib -fuse-ld=bfd libf.a /root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.2/sdk/libbootstrapperdll.o/root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.2/sdk/libRuntime.WorkstationGC.a/root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.il编译器/8.0.2/sdk/libeventpipe-disabled.a/root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.2/sdk/libstdc++compat.a/root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.2/framework/libSyste m.Native.a/root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.2/framework/libSystem.Globalization.Native.a/root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.2/framework/libSystem.IO.Compression.Native.a/root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.2/framework/libSystem.Net.Security.Native.a/root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.2/framework/libSystem.Security.Cryptography.Native.OpenSsl.ag -Wl,-rpath,'$ORIGIN' -Wl,--build-id=sha1 -Wl,--as-needed -Wl,-e0x0 -pthread -ldl -lz -lrt -lm -shared -Wl,-z,relro -Wl,-z,now -Wl,--eh-frame-hdr -Wl,--discard-all -Wl,--gc-sections\' 退出,代码为 1。
另外,如果我进入 /usr/bin
并尝试, ld.bfd -lz
我会再次收到以下错误;
ld.bfd: cannot find -lz: No such file or directory
而如果我在一台能够编译该库而没有错误的机器上运行相同的程序,我会得到以下结果;
ld.bfd: warning: cannot find entry symbol _start; not setting start address
这让我认为 Ubuntu 中缺少某些库或组件,从而导致我收到错误消息。有人知道那可能是什么吗?