2012-02-28 72 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塊中,但我不知道由curses定義的任何標誌。

是否有可能捕獲這些錯誤,而是將ClearScreen()定義爲空函數?

+0

這實際上是一個鏈接器錯誤,而不是編譯器錯誤。一個C++編譯器通常生成一個'.o'(或'.obj')文件,鏈接器會收集所有'.o'文件以形成庫(動態或靜態)或可執行文件。 – 2012-02-28 18:42:37

回答

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,則會失敗編譯。 – 2012-02-28 18:45:53

+0

這是在'term.h'中爲我定義的,所以它的定義與'-lcurses'標誌無關 – everett1992 2012-02-28 18:45:53

+0

我有一個make文件,但是這是一個學校項目,我擔心老師會把所有的文件放在xcode/textmate中,或者只是做g ++ *。CPP,即使我包括如何使用make的說明。 – everett1992 2012-02-28 19:17:19

0

其實,這是一個鏈接器錯誤。不,在編譯時不能真正捕獲它。但有一種可能性是在ClearScreen中動態加載共享對象。如果它無法加載庫,那麼它可能會返回。如果不保證在目標系統上最終運行二進制文件,那麼在運行時進行檢查可能更適合構建時間檢查。

0

你正在做什麼(配置項目的依賴性) - 是構建系統的經典任務。

例如,CMake,你必須FindCurses模塊,它定義了CURSES_FOUND處理器變量(如果它開創庫)。

隨着GNU Autotools你會有類似的宏,請參閱相關文件。

如果您使用自己的構建系統 - 那麼您必須在配置時間內手動編寫相關標誌的處理代碼。

0

構建腳本應該檢測是否合適版本curses存在於構建機器上。您可以產生這樣的腳本GNU自動工具,例如(結果是再去讀一個熟悉的configure腳本。你也可以寫在sh/bash一個簡單的自定義腳本。

+0

這是一個學校項目,我已經包含了makefile和使用它的說明,但我擔心老師可能會將所有.h和.cpp文件放在visual studio/textmate中或者運行g ++ *。 CPP或類似的東西。 – everett1992 2012-02-28 18:56:19

+0

假設在Windows機器上不會安裝curses是安全的,因此只需檢查是否定義了WIN32。最重要的是,您可以檢查像HAVE_CURSES這樣的宏。如果未定義,則默認在Windows上爲0,在已知類Unix系統上爲1。如果老師知道如何在Winsows上安裝curses,她會知道將「-DHAVE_CURSES」添加到編譯器標誌。 – 2012-02-28 19:08:36

+0

我已經檢查過windows,並實現了一個不同的功能 – everett1992 2012-02-28 19:15:22

0

的問題,你有沒有考慮的是,你的代碼可能# include的ncurses.h,如果沒有編譯器可以找到它的庫,它將無法工作。

+0

它只包含'unistd.h'和'term.h' – everett1992 2012-02-28 19:14:51

+0

@ everett1992這兩個都是非標準的頭文件。特別是'term.h',例如在Windows上不可用。 – rubenvb 2012-02-28 19:55:24

+0

我檢查窗口並實現不同的功能。我只是嘗試在我的學校redhat電腦上進行編譯,並且抱怨沒有term.h,所以我想我需要更多的檢查。 – everett1992 2012-02-28 20:28:57