打开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格式很抱歉,我没有设法更改它!
答案 0 :(得分:2)
这实际上很容易做到,与SDL或您的构建系统无关。
先要
完成此操作的正确方法是生成“应用程序捆绑包”。关于如何制作一个现有的大量问题/文档。 @Mark Setchell在他的回答中介绍了一种这样的方法。
如果出于某些原因您希望避免继续阅读应用程序捆绑包,那么
实际发生的事情
当您双击可执行文件或应用程序时,它实际上不会执行。发生的情况是该路径被传递到Launch Services,然后该路径将检查某物是“应用程序捆绑包”还是其他东西。如果不是应用程序捆绑包,则LS会检查其数据库以查看应使用哪个应用程序打开它。您可以看到(通过在Finder中使用“获取信息”),如果是独立的二进制文件,则将其设置为“ Open with” Terminal.app。这就是双击您的二进制文件时打开终端的原因。
您如何更改行为
您需要说服Launch Services双击的是一个应用程序捆绑包。您唯一需要做的就是将.app
扩展名添加到二进制文件中。就是这样。
我刚刚在Xcode上创建了一个新的“命令行实用程序”,在10.13上对此进行了测试。我只是向其添加了一个.app
扩展名,然后双击它,它就可以正常运行了。我不确定您是否可能会遇到使用stdin
或stdout
(stderr
似乎已路由到系统控制台)的问题(除了显而易见的问题)
如果您需要一个或只想显示一个版本或某些内容,甚至可以通过Xcode(构建设置->包装->在Binary中创建Info.plist部分)将Info.plist
文件直接嵌入二进制文件中。 Finder。
限制
但是有一个警告,如果涉及代码签名,则不能仅仅将现有的应用程序捆绑拆开试试。从与框架链接的现有捆绑包中提取的二进制文件的@rpath
需要进行更改。同上任何捆绑资源。
如前所述,您实际上没有stdin
或stdout
。 SDL应用程序可能不在乎,因为它将创建自己的UI。除了可能仍然应直接指向控制台的日志记录。