你能用c++处理编译时的错误吗
Can you handle compile time errors in c++?
我的项目有一个清除终端的函数,该函数是使用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,如果没有安装编译器可以找到它的库,它将永远无法工作。
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- std::is_base_of表示ctor编译错误
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- Qt Cmake 错误编译"GuiSupportQt not found"
- Opengl 精度转换错误编译错误 E0415
- 库将ARM架构错误编译为架构X64
- RT 音频 Mac 错误 g++ 编译错误
- 错误编译Boost.log
- 错误编译QT创建者 / QT窗口小部件示例
- 错误编译MIPS32
- Visual Studio 2013 中的错误(编译和运行代码)
- 链接错误编译qt项目在visual 2010
- 无法用模板错误编译nsgmls
- 奇怪的错误.编译失败
- 如果有人调用c++中的方法,则强制错误(编译时)
- 来自autoconf测试的错误编译命令
- 时间限制超出错误C++编译
- SFML 2.3 和 CodeBlocks 错误编译