Можете ли вы обрабатывать ошибки времени компиляции в C ++? - PullRequest
2 голосов
/ 28 февраля 2012

В моем проекте есть функция очистки терминала, которая реализована с использованием библиотеки 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 ]

1 голос
/ 28 февраля 2012

Вы можете определить макрос в 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
0 голосов
/ 28 февраля 2012

Проблема, которую вы не рассмотрели, заключается в том, что ваш код, вероятно, # includes ncurses.h, который никогда не будет работать без установки библиотеки, где компилятор сможет ее найти.

0 голосов
/ 28 февраля 2012

Ваш скрипт сборки должен определить, присутствует ли подходящая версия curses на машине сборки. Вы можете сгенерировать такой скрипт, например, с помощью GNU Autotools (результатом будет знакомый configure скрипт. Вы также можете написать простой пользовательский скрипт в sh / bash.

0 голосов
/ 28 февраля 2012

Вам действительно нужна эта библиотека. Может быть, это поможет вам: http://linux.die.net/man/3/tigetstr

0 голосов
/ 28 февраля 2012

То, что вы пытаетесь сделать (настройка проекта с учетом зависимостей) - это классическая задача построения систем.

Например, с CMake вы получите *Модуль 1005 *, который определяет CURSES_FOUND переменную препроцессора (если он найдет библиотеку).

С GNU Autotools у вас будет похожий макрос, обратитесь к соответствующей документации.

Если вы используете свою собственную систему сборки - тогда вам придется вручную кодировать обработку соответствующих флагов во время конфигурации.

0 голосов
/ 28 февраля 2012

На самом деле это ошибка компоновщика. И нет, его нельзя поймать во время компиляции. Но одной из возможностей может быть динамическая загрузка общего объекта в ClearScreen. Если не удалось загрузить библиотеку, она может просто вернуться. Выполнение проверки во время выполнения может быть предпочтительнее, чем проверка времени сборки, если вы не гарантируете сборку двоичного файла в целевой системе, в которой он в конечном итоге будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...