你能用c ++处理编译时错误吗?

时间:2012-02-28 18:26:48

标签: c++ compiler-errors

我的项目有一个清除终端的功能,它是使用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()定义为空函数?

6 个答案:

答案 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,如果没有安装库,编译器可以找到它,它将无法工作。