簡體   English   中英

在OSX上打開SDL窗口時不要打開終端窗口

[英]Don't open terminal window while opening SDL window on OSX

打開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格式我沒有設法改變它!

我不知道是否有“正確”的方法來執行此操作,但我將您的程序編譯為名為main的二進制可執行文件:

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

然后我從這里使用appify ,使其成為一個常規的“應用程序”

appify main "Mark App"

當我雙擊我閃亮的新Mark App它會拋出一個SDL窗口而沒有終端。


如果您啟動Xcode並單擊File - > New Project ,它將為您提供創建“命令行工具”“Cocoa應用程序”的選項 我想如果你這樣做並創建了兩種類型的應用程序,你可以比較,看看生成的文件有什么不同,並做到這一點,但我不知道自己。

這實際上很容易做到,與SDL或構建系統無關。

首先是旁邊

實現此目的的正確方法是生成“app bundle”。 有很多關於如何生產的問題/文檔。 @Mark Setchell在他的回答中介紹了一種這樣的方法。

如果出於某種原因,您希望避免閱讀應用程序包,了解如何使用。

實際發生了什么

雙擊可執行文件或應用程序時,它實際上並不執行它。 會發生什么情況是將路徑傳遞給Launch Services ,然后檢查某些內容是否為“app bundle”或其他內容。 如果它不是應用程序包LS,則檢查其數據庫以查看它應該打開它的應用程序。 您可以看到(通過在Finder中使用“獲取信息”),在獨立二進制文件的情況下,它被設置為“打開方式”Terminal.app。 這是雙擊二進制文件時終端打開的原因。

你如何改變行為

您需要說服啟動服務,您雙擊的是應用程序包。 您需要做的唯一事情是將.app擴展名添加到二進制文件中。 而已。

我剛剛在X3上創建了一個新的“命令行實用程序”,在10.13上測試了它。 我只是添加了一個.app擴展名並雙擊它然后打開並運行得很好。 我不確定你是否會遇到使用stdinstdoutstderr似乎被路由到系統控制台)的問題(除了明顯的問題)

您甚至可以通過Xcode(Build Settings - > Packaging - >二進制創建Info.plist部分)將Info.plist文件直接嵌入到二進制文件中(如果您需要)或只是想在Finder中顯示某個版本或某些內容。

限制

但是有一點需要注意,如果涉及代碼簽名,你就不能拆開現有的應用程序包來試試它。 從連接到框架的現有包中拉出的二進制文件的@rpath將需要更改。 同上任何捆綁資源。

如前所述,你真的沒有stdinstdout SDL應用程序可能不關心,因為它將創建自己的UI; 除了可能記錄,無論如何應該指向控制台。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM