gpt4 book ai didi

c++ - 在 OSX 上打开 SDL 窗口时不要打开终端窗口

转载 作者:太空狗 更新时间:2023-10-29 20:33:53 31 4
gpt4 key购买 nike

打开SDL程序时,双击图标,也会弹出一个终端窗口。我们怎样才能避免这种情况?

我看到在 Windows 操作系统上,有一个编译选项 -mwindows 可以执行此操作,但它在 OSX 上不起作用。

这是我的代码:

#include <iostream>
#include <SDL2/SDL.h>

int main(int argc, char *argv[])
{
// SDL window
SDL_Window* window(0);

SDL_Event events;
bool quit(false);

// Initialize SDL
if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
std::cout << "Initialization error : " << SDL_GetError() << std::endl;
SDL_Quit();

return -1;
}

// Create window
window = SDL_CreateWindow("Windows", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);

if(window == 0)
{
std::cout << "Creation error : " << SDL_GetError() << std::endl;
SDL_Quit();

return -1;
}

// Main loop
while(!quit)
{
SDL_WaitEvent(&events);

if(events.window.event == SDL_WINDOWEVENT_CLOSE)
quit = true;
}

// Quit SDL
SDL_DestroyWindow(window);
SDL_Quit();

return 0;
}

这是我的生成文件:

# Makefile
.PHONY: clean, mrproper, run

NAME=Program

EXEC=$(NAME)
SRC_DIR=./Sources
HEA_DIR=./Headers
OBJ_DIR=./Objects
SRC=$(wildcard $(SRC_DIR)/*.cpp)
OBJ=$(patsubst $(SRC_DIR)/%.cpp, $(OBJ_DIR)/%.o, $(SRC))

HEA=$(wildcard $(HEA_DIR)/*.h)

FRA_DIR=/Library/Frameworks/SDL2.framework/Headers/

CXX=g++
CXXFLAGS=-W -Wall -std=c++11 -I $(HEA_DIR) \
-I $(FRA_DIR)
LDFLAGS=-F/Library/Frameworks -framework SDL2

all: $(EXEC)

$(EXEC): $(OBJ)
$(CXX) -o $@ $^ $(LDFLAGS)

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(HEA)
$(CXX) -o $@ -c $< $(CXXFLAGS)

clean:
@rm -rf $(OBJ_DIR)/*.o

mrproper: clean
@rm -rf $(EXEC)

run:
@./$(EXEC)

提前致谢

PS:对于我的 makefile 的格式,我很抱歉我没有设法改变它!

最佳答案

这实际上很容易做到,与 SDL 或您的构建系统无关。

先说一句

完成此任务的正确方法是生成“应用程序包”。关于如何生成一个问题/文档有很多。 @Mark Setchell 在他的回答中介绍了一种这样的方法。

如果出于某种原因您希望避免使用 app bundle,请继续阅读以了解如何做到。

实际发生了什么

当您双击可执行文件或应用程序时,它实际上并没有执行。发生的事情是路径传递给 Launch Services然后将检查某物是否是“应用程序包”或其他东西。如果不是应用程序包,LS 会检查其数据库以查看应使用哪个应用程序打开它。您可以看到(通过在 Finder 中使用“获取信息”)在独立二进制文件的情况下,它被设置为“打开方式”Terminal.app。这就是当您双击二进制文件时打开终端的原因。

您如何改变行为

您需要让 Launch Services 相信您双击的是一个应用程序包。您唯一需要做的就是将 .app 扩展名添加到您的二进制文件中。就是这样。

我刚刚通过在 Xcode 中创建一个新的“命令行实用程序”在 10.13 上对此进行了测试。我只是向它添加了一个 .app 扩展名,然后双击它,它打开并运行得很好。我不确定您是否会遇到使用 stdinstdout (stderr 似乎是路由到系统控制台)

如果您需要一个或只是想要一个版本,您甚至可以通过 Xcode(build设置 -> 打包 -> 在二进制文件中创建 Info.plist 部分)将 Info.plist 文件直接嵌入到二进制文件中或在 Finder 中显示的内容。

限制

但是有一点需要注意,如果涉及代码签名,您不能直接拆开现有的应用程序包来尝试。从链接到框架的现有包中提取的二进制文件的 @rpath 需要更改。同上任何捆绑资源。

如前所述,您实际上没有stdinstdout。 SDL 应用程序可能并不关心,因为它会创建自己的 UI;除了也许应该在控制台定向的日志记录。

关于c++ - 在 OSX 上打开 SDL 窗口时不要打开终端窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52310333/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com