Xcode和Curses.h,错误打开终端
我试图用Xcode编译一个简单的诅咒项目.
程序在带有标志-lcurses的终端中用g编译好,运行正常. 通过创建类型为c的命令行工具开始. 编译正常但终端窗口无法打开. 程序已加载. 我可以去构建文件夹,只是在终端打开程序,但有没有办法让xcode打开终端? 谢谢你的帮助! 解决方法
我在Xcode中使用ncurses调试时遇到了同样的问题.最后,我找到了一个很好的方法来管理使用Terminal.app进行调试,允许调试ncurses.
我们知道,要初始化和使用ncurses,我们需要在终端中运行我们的应用程序.但是当我们按下运行按钮时,Xcode没有打开终端.因此,如果我们从代码中请求环境变量TERM,我们将获得NULL.这就是应用程序在initscr()上崩溃的原因. 但Xcode允许我们为运行方案(产品>方案>编辑方案…>运行)设置启动选项为“等待可执行文件启动”而不是默认“自动”: 现在我们可以在Xcode中按Run并在终端中手动启动我们的应用程序.因此调试器将附加到应用程序.有两个问题: >如果说实话,调试器不会在没有其他操作的情况下自我附加,它将跳过所有断点.但是我们可以通过在程序开始时调用getchar()来管理它.我通过引入指示我们在终端中调试的命令行参数解决了这个问题: for (int argi = 1; argi < argc; argi++) { if (strcmp(argv[argi],"--debug-in-terminal") == 0) { printf("Debugging in terminal enabledn"); getchar(); // Without this call debugging will be skipped break; } } 因此,只有当我们想在Terminal.app中调试时,我们才能打开getchar()调用 osascript -e 'tell application "Terminal"' -e 'delay 0.5' -e "set currentTab to do script ("$TARGET_BUILD_DIR/$PRODUCT_NAME --debug-in-terminal")" -e 'end tell' & 不要忘记在“提供构建设置”列表中选择您的应用程序,以使可访问的重要环境变量$TARGET_BUILD_DIR和$PRODUCT_NAME: 所以,现在当我们按Run时,Xcode将等待可执行文件附加,终端将被打开,我们的应用程序将使用命令行选项–debug-in-terminal执行,所有断点都将被触发. 非常好,但最终关闭此终端窗口会更好,因为它会为每个调试会话生成一个新窗口.让我们在Post-actions for Run方案中做到: osascript -e 'activate application "Terminal"' -e 'delay 0.5' -e 'tell application "System Events"' -e 'tell process "Terminal"' -e 'keystroke "w" using {command down}' -e 'end tell' -e 'end tell' 此命令只关闭活动终端窗口,因此如果您计划在调试会话期间将某个终端用于其他目的,则可能不需要此Post-action,因为您可能会意外关闭某个重要窗口. 最后,一个安全ncurses代码的想法,检查我们是否可以使用ncurses或不: #include <stdlib.h> #include <string.h> #include <ncurses.h> bool IsTerminalAvailable = false; // Check this global variable before ncurses calls int main(int argc,const char *argv[]) { for (int argi = 1; argi < argc; argi++) { if (strcmp(argv[argi],"--debug-in-terminal") == 0) { printf("Debugging in terminal enabledn"); getchar(); // Without this call debugging will be skipped break; } } char *term = getenv("TERM"); IsTerminalAvailable = (term != NULL); if (IsTerminalAvailable) IsTerminalAvailable = (initscr() != NULL); // Do some code here.... if (IsTerminalAvailable) { printw("Press any key to exit..."); refresh(); getch(); endwin(); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |