2012-02-28 3 views
2

В моем проекте есть функция, которая очищает терминал, который реализуется с помощью библиотеки curses. Компиляция с -lcurses флагом отлично работает, но компиляция без yeildsМожете ли вы обрабатывать ошибки времени компиляции в C++?

/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, но я не знаю никаких флагов, определенных проклятиями.

Возможно ли уловить эти ошибки и вместо этого определить ClearScreen() как пустую функцию?

+0

Это скорее ошибка компоновщика, а не ошибка компилятора. Компилятор C++ обычно создает один '.o' (или '.obj') на файл' .cpp', который он обрабатывает, и компоновщик собирает все '.o', чтобы сформировать библиотеку (динамическую или статическую) или исполняемый файл. –

ответ

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

Вам нужно' #include 'для Если libcurses не установлен, это провалится Скомпилировать. –

+0

Это определено в 'term.h' для меня, поэтому оно определено независимо от флага' -lcurses' – everett1992

+0

У меня есть файл make, но это для школьного проекта, и я беспокоюсь, что учитель просто поместите все файлы в xcode/textmate или просто выполните g ++ *.cpp, хотя я включил инструкции о том, как использовать make. – everett1992

0

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

0

Что вы пытаетесь сделать (настройка проекта по отношению к зависимостям) - это классическая задача систем сборки.

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

С GNU Autotools у вас будет аналогичный макрос, обратитесь к соответствующей документации.

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

0

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

+0

Это для школьного проекта, я включил make-файл и инструкции для его использования, но я беспокоюсь, что учитель может просто удалить все файлы .h и .cpp в visual studio/textmate или запустить g ++ *. cpp или что-то подобное. – everett1992

+0

Можно с уверенностью предположить, что на компьютере с Windows не будет никаких проклятий, поэтому просто установите для WIN32 определенную. Кроме того, вы можете проверить макрос как HAVE_CURSES. Если undefined, по умолчанию для 0 в Windows и 1 для известных Unix-подобных систем. Если учитель знает, как установить проклятия на Winsows, она будет знать, чтобы добавить '-DHAVE_CURSES' в флаги компилятора. –

+0

Я уже проверяю наличие окон и реализую другую функцию. – everett1992

0

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

+0

Он включает только 'unistd.h' и' term.h' – everett1992

+0

@ everett1992, которые являются нестандартными заголовками. Особенно «term.h», который недоступен в Windows, например. – rubenvb

+0

Я проверяю окна и реализую другую функцию. Я просто попробовал собрать в своих школах компьютеры redhat, и он жаловался на отсутствие term.h, поэтому я думаю, мне нужно больше проверок. – everett1992

Смежные вопросы