我的项目有一个清除终端的功能,它是使用curses库实现的。使用-lcurses
标志进行编译工作正常,但无需编译
/tmp/cc3T2MVI.o: In function `ClearScreen()':
clear_term.cpp:(.text+0xb): undefined reference to `cur_term'
clear_term.cpp:(.text+0x26): undefined reference to `setupterm'
clear_term.cpp:(.text+0x37): undefined reference to `tigetstr'
clear_term.cpp:(.text+0x3f): undefined reference to `putp'
collect2: ld returned 1 exit status
这显然是预期的,因为它无法找到库,但由于此功能是补充的,因此最好将ClearScreen()
定义为空函数而不是编译失败。我知道我将函数定义放在#ifdef
块中,但我不知道curses定义的任何标志。
是否可以捕获这些错误,而是将ClearScreen()
定义为空函数?
答案 0 :(得分:1)
您可以在Makefile中定义一个宏:
use_curses=1
FLAGS+=-DUSING_MAKEFILE
ifeq ($(use_curses),0)
FLAGS+=-DNO_NCURSES
else
LIBS+=-lcurses
endif
在代码中:
#ifndef USING_MAKEFILE
# error "Please use provided Makefile to compile!"
#endif
#ifdef NO_CURSES
void ClearScreen() { }
#endif
答案 1 :(得分:0)
实际上,这是一个链接器错误。不,它不能真正在编译时捕获。但有一种可能性是在ClearScreen
中动态加载共享对象。如果它无法加载库,那么它可以返回。如果不能保证在最终运行它的目标系统上构建二进制文件,那么在运行时进行检查可能比构建时间检查更可取。
答案 2 :(得分:0)
您要做的事情(根据依赖项配置项目) - 是构建系统的经典任务。
例如,对于CMake,您将拥有FindCurses
模块,该模块定义CURSES_FOUND
预处理器变量(如果它找到了库)。
使用GNU Autotools您将拥有类似的宏,请参阅相关文档。
如果您正在使用自己的构建系统 - 那么您必须在配置时手动编写相关标志的处理。
答案 3 :(得分:0)
你真的需要这个库。 也许它会对你有所帮助:http://linux.die.net/man/3/tigetstr
答案 4 :(得分:0)
您的构建脚本应检测构建计算机上是否存在合适版本的curses。例如,您可以使用GNU Autotools生成此类脚本(结果我将是熟悉的configure
脚本。您还可以在sh
/ bash
中编写一个简单的自定义脚本。
答案 5 :(得分:0)
您没有考虑的问题是您的代码可能是#include的ncurses.h,如果没有安装库,编译器可以找到它,它将无法工作。