使用 Curses 在 C 程序中创建一个盒子
Create a box in C Program with Curses
我正在尝试创建一个盒子,盒子里有一个游戏,但现在我正在使用文本 this is my box
进行测试。我第一次对诅咒感到困惑,但我正在努力在业余时间自学。我以前用其他 C 程序没有任何问题,但是这次,当我在 Repl.it 上编译时,我一直收到消息错误,但是 #include <windows.h>
不存在于系统文件或 Linux系统也是。
#include <stdio.h>
#include <ncurses.h>
#include <stdlib.h>
int main(int argc, char ** argv){
initscr();
int height, width, start_y, start_x;
height = 10;
width = 20;
start_y = start_x = 10;
WINDOW * win = newwin(height, width, start_y, start_x);
refresh();
box(win, 0, 0);
mvwprintw(win, 1, 1, "this is my box");
wrefresh(win);
int c = getch();
endwin();
return 0;
}
错误信息:
gcc version 4.6.3
exit status 1
/tmp/cc3HSdBS.o: In function `main':
main.c:(.text+0x10): undefined reference to `initscr'
main.c:(.text+0x3e): undefined reference to `newwin'
main.c:(.text+0x49): undefined reference to `stdscr'
main.c:(.text+0x51): undefined reference to `wrefresh'
main.c:(.text+0x82): undefined reference to `wborder'
main.c:(.text+0xa6): undefined reference to `mvwprintw'
main.c:(.text+0xb2): undefined reference to `wrefresh'
main.c:(.text+0xb9): undefined reference to `stdscr'
main.c:(.text+0xc1): undefined reference to `wgetch'
main.c:(.text+0xc9): undefined reference to `endwin'
collect2: error: ld returned 1 exit status
编译:
g++ -Incurses project.c -o project
您必须将链接器标志传递给编译器,以便在编译时链接 ncurses
库。这个标志是 -lncurses
.
根据 OP 的评论,编译器调用是:
g++ -Incurses project.c -o project
初始的 l
(ell) 在链接器标志中被错误地变成了 I
(一个容易犯的错误)。此外,链接器标志在此调用中的位置错误。链接器标志必须跟在它们的源文件之后。更好的调用是:
g++ -o project project.c -lncurses
我不确定为什么 OP 在 C 代码中使用 g++
;直接使用 gcc
可能会更好。我还建议始终启用一些警告:
gcc -std=c11 -Wall -Wextra -Wpedantic -o project project.c -lncurses
我正在尝试创建一个盒子,盒子里有一个游戏,但现在我正在使用文本 this is my box
进行测试。我第一次对诅咒感到困惑,但我正在努力在业余时间自学。我以前用其他 C 程序没有任何问题,但是这次,当我在 Repl.it 上编译时,我一直收到消息错误,但是 #include <windows.h>
不存在于系统文件或 Linux系统也是。
#include <stdio.h>
#include <ncurses.h>
#include <stdlib.h>
int main(int argc, char ** argv){
initscr();
int height, width, start_y, start_x;
height = 10;
width = 20;
start_y = start_x = 10;
WINDOW * win = newwin(height, width, start_y, start_x);
refresh();
box(win, 0, 0);
mvwprintw(win, 1, 1, "this is my box");
wrefresh(win);
int c = getch();
endwin();
return 0;
}
错误信息:
gcc version 4.6.3
exit status 1
/tmp/cc3HSdBS.o: In function `main':
main.c:(.text+0x10): undefined reference to `initscr'
main.c:(.text+0x3e): undefined reference to `newwin'
main.c:(.text+0x49): undefined reference to `stdscr'
main.c:(.text+0x51): undefined reference to `wrefresh'
main.c:(.text+0x82): undefined reference to `wborder'
main.c:(.text+0xa6): undefined reference to `mvwprintw'
main.c:(.text+0xb2): undefined reference to `wrefresh'
main.c:(.text+0xb9): undefined reference to `stdscr'
main.c:(.text+0xc1): undefined reference to `wgetch'
main.c:(.text+0xc9): undefined reference to `endwin'
collect2: error: ld returned 1 exit status
编译:
g++ -Incurses project.c -o project
您必须将链接器标志传递给编译器,以便在编译时链接 ncurses
库。这个标志是 -lncurses
.
根据 OP 的评论,编译器调用是:
g++ -Incurses project.c -o project
初始的 l
(ell) 在链接器标志中被错误地变成了 I
(一个容易犯的错误)。此外,链接器标志在此调用中的位置错误。链接器标志必须跟在它们的源文件之后。更好的调用是:
g++ -o project project.c -lncurses
我不确定为什么 OP 在 C 代码中使用 g++
;直接使用 gcc
可能会更好。我还建议始终启用一些警告:
gcc -std=c11 -Wall -Wextra -Wpedantic -o project project.c -lncurses