Не открывайте окно терминала при открытии окна SDL в OSX - PullRequest
0 голосов
/ 13 сентября 2018

При открытии программы 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;
}

А вот мой make-файл:

# 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: извините за формат моего make-файла, мне не удалось это изменить!

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Это на самом деле очень легко сделать и не имеет ничего общего с SDL или вашей системой сборки.

Сначала отступим

Правильный способ сделать этосоздать "комплект приложений".Существует множество существующих вопросов / документации о том, как их создать.@Mark Setchell описывает один из таких методов в своем ответе.

Если по какой-то причине вы хотите избежать комплектации приложений, прочитайте, как вы можете.

Что на самом деле происходит

Когда вы дважды щелкаете исполняемый файл или приложение, оно на самом деле не выполняется.Что происходит, так это то, что путь передается Launch Services , который затем проверит, является ли что-то «комплектом приложений» или чем-то еще.Если это не комплект приложений, LS проверяет свою базу данных, чтобы увидеть, с каким приложением он должен ее открыть.Вы можете увидеть (используя «Get Info» в Finder) в случае автономного двоичного файла он установлен на «Open with» Terminal.app.По этой причине терминал открывается при двойном щелчке по двоичному файлу.

Как изменить поведение

Вам необходимо убедить Launch Services, что двойной щелчок являетсякомплект приложений.Единственное, что вам нужно сделать, это добавить расширение .app в ваш бинарный файл.Вот и все.

Я только что проверил это на 10.13, создав новую утилиту командной строки в XCode.Я просто добавил расширение .app к нему и дважды щелкнул по нему, и он открылся и работал очень хорошо.Я не уверен, что вы можете столкнуться с проблемами (помимо очевидных) с чем-то, что использует stdin или stdout (stderr, кажется, направляется на системную консоль)

Вы можете дажевставьте файл Info.plist непосредственно в двоичный файл через Xcode (Настройки сборки -> Упаковка -> Создать раздел Info.plist в двоичном файле), если вам нужен один или вы просто хотите, чтобы версия или что-то отображалось в Finder.

Ограничения

Однако есть предостережение: если используется подписание кода, вы не можете просто разобрать существующий комплект приложений, чтобы попробовать его.@rpath двоичного файла, извлеченного из существующего пакета, связанного с каркасами, необходимо будет изменить.То же самое относится к ресурсам комплекта.

Как уже упоминалось ранее, у вас действительно нет stdin или stdout.Приложение SDL, вероятно, не заботится, поскольку оно создаст свой собственный интерфейс;за исключением, возможно, регистрации, которая в любом случае должна быть направлена ​​на консоль.

0 голосов
/ 13 сентября 2018

Я не знаю, существует ли "правильный" способ сделать это, но я скомпилировал вашу программу в двоичный исполняемый файл с именем main с помощью:

clang++ main.cpp $(pkg-config --cflags --libs sdl2) -o main

Затем я использовал appify из здесь , чтобы превратить его в обычное "приложение" :

appify main "Mark App"

и когда я дважды щелкаю по своему блестящему новому Mark App, он открывает окно SDL, а не терминал.


Если вы запустите Xcode и нажмете File -> New Project, он предложит вам варианты создания «инструмента командной строки» или «приложения какао», Я полагаю, что если бы вы сделали это и создали оба типа приложений, вы могли бы сравнить и посмотреть, в чем разница в сгенерированных файлах, и сделать это, но я сам не знаю.

...