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

Can you handle compile time errors in c++?

本文关键字:错误 编译 处理 c++      更新时间:2023-10-16

我的项目有一个清除终端的函数,该函数是使用curses库实现的。使用-lcurses标志进行编译效果良好,但不使用yeilds 进行编译

/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()定义为空函数?

您可以在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

实际上,这是一个链接器错误。不,它不能在编译时被捕获。但一种可能性是在ClearScreen中动态加载共享对象。如果它未能加载库,那么它可能会返回。如果不能保证在最终运行二进制文件的目标系统上构建二进制文件,那么在运行时进行检查可能比构建时间检查更可取。

您真的需要这个库。也许它会帮助你:http://linux.die.net/man/3/tigetstr

您要做的(根据依赖项配置项目)是构建系统的经典任务。

例如,使用CMake,您将拥有FindCurses模块,它定义了CURSES_FOUND预处理器变量(如果它找到了库)。

使用GNU Autotools,您将拥有类似的宏,请参阅相关文档。

如果您使用自己的构建系统,那么您必须在配置时手动编码相关标志的处理。

您的构建脚本应该检测构建机器上是否存在合适版本的curses。例如,您可以使用GNU Autotools生成这样的脚本(结果I应该是一个熟悉的configure脚本。您也可以在sh/bash中编写一个简单的自定义脚本。

您没有考虑的问题是,您的代码可能是#include的ncurses.h,如果没有安装编译器可以找到它的库,它将永远无法工作。