今天晚上在Mac上安装cscope插件时,碰到一个编译问题。虽然最近在编译一个C++工程时也碰到不少编译的问题,但是对于今天碰到的这个问题,还是第一次碰到。具体情况如下:
在编译cscope-15.8a版本的代码,make这一步时抛出如下错误
-
In file included from build.c:50: /usr/include/ncurses.h:539:40: error: macro “cbreak” passed 1 arguments, but takes just 0 /usr/include/ncurses.h:564:44: error: macro “erasechar” passed 1 arguments, but takes just 0 /usr/include/ncurses.h:600:43: error: macro “killchar” passed 1 arguments, but takes just 0 make[2]: *** [build.o] Error 1 make[1]: *** [all-recursive] Error 1 make: *** [all] Error 2
于是grep一下cscope的源码,找到constants.h中含有这几个方法。代码如下:
#if (BSD || V9) && !__NetBSD__ && !__FreeBSD__ # define TERMINFO 0 /* no terminfo curses */ #else # define TERMINFO 1 #endif #undef TERMINFO 0 #define TERMINFO 1 #if !TERMINFO # ifndef KEY_BREAK # define KEY_BREAK 0400 /* easier to define than to add #if around the use */ # endif # ifndef KEY_ENTER # define KEY_ENTER 0401 # endif # ifndef KEY_BACKSPACE # define KEY_BACKSPACE 0402 # endif # if !sun # define cbreak() crmode() /* name change */ # endif # if UNIXPC # define erasechar() (_tty.c_cc[VERASE]) /* equivalent */ # define killchar() (_tty.c_cc[VKILL]) /* equivalent */ # else # define erasechar() (_tty.sg_erase) /* equivalent */ # define killchar() (_tty.sg_kill) /* equivalent */ # endif /* if UNIXPC */ #endif /* if !TERMINFO */
看这段代码,只要让TERMINFO为1,即可不使用这几个函数。于是加上上面第11行和第13行代码,即可通过编译。