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

时间:2018-09-13 09:09:07

标签: c++ macos makefile sdl

打开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文件:

# 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格式很抱歉,我没有设法更改它!

1 个答案:

答案 0 :(得分:2)

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

先要

完成此操作的正确方法是生成“应用程序捆绑包”。关于如何制作一个现有的大量问题/文档。 @Mark Setchell在他的回答中介绍了一种这样的方法。

如果出于某些原因您希望避免继续阅读应用程序捆绑包,那么

实际发生的事情

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

您如何更改行为

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

我刚刚在Xcode上创建了一个新的“命令行实用程序”,在10.13上对此进行了测试。我只是向其添加了一个.app扩展名,然后双击它,它就可以正常运行了。我不确定您是否可能会遇到使用stdinstdoutstderr似乎已路由到系统控制台)的问题(除了显而易见的问题)

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

限制

但是有一个警告,如果涉及代码签名,则不能仅仅将现有的应用程序捆绑拆开试试。从与框架链接的现有捆绑包中提取的二进制文件的@rpath需要进行更改。同上任何捆绑资源。

如前所述,您实际上没有stdinstdout。 SDL应用程序可能不在乎,因为它将创建自己的UI。除了可能仍然应直接指向控制台的日志记录。