[英]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
擴展名並雙擊它然后打開並運行得很好。 我不確定你是否會遇到使用stdin
或stdout
( stderr
似乎被路由到系統控制台)的問題(除了明顯的問題)
您甚至可以通過Xcode(Build Settings - > Packaging - >二進制創建Info.plist部分)將Info.plist
文件直接嵌入到二進制文件中(如果您需要)或只是想在Finder中顯示某個版本或某些內容。
限制
但是有一點需要注意,如果涉及代碼簽名,你就不能拆開現有的應用程序包來試試它。 從連接到框架的現有包中拉出的二進制文件的@rpath
將需要更改。 同上任何捆綁資源。
如前所述,你真的沒有stdin
或stdout
。 SDL應用程序可能不關心,因為它將創建自己的UI; 除了可能記錄,無論如何應該指向控制台。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.