2012-02-28 9 views
2

私のプロジェクトには、ターミナルをクリアする関数があります。これは、cursesライブラリを使って実装されています。 -lcursesフラグを付けてコンパイルすると、正常に動作しますが、yeildsC++でコンパイル時エラーを処理できますか?

/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

これは実際にはリンカエラーであり、コンパイラエラーではありません。 '.obj')ファイルを扱い、リンカは' .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

実際、これはリンカエラーです。そして、いいえ、コンパイル時に実際には捕まえられません。しかし、1つの可能性は、共有オブジェクトを動的にロードすることですClearScreen。ライブラリをロードできなかった場合は、ライブラリをロードするだけです。最終的に実行されるターゲット・システムにバイナリーを構築することが保証されていない場合は、実行時に検査を行うことが時間検査を構築する方が望ましい場合があります。

0

あなたがしようとしていること(依存関係に関してプロジェクトを設定する)は、ビルドシステムの古典的な仕事です。

たとえば、CMakeの場合はFindCursesモジュールがあり、CURSES_FOUNDプリプロセッサ変数(ライブラリが見つかった場合)を定義します。

GNU Autotoolsと同様のマクロを使用する場合は、関連するドキュメントを参照してください。

独自のビルドシステムを使用している場合は、構成時に関連するフラグの処理を手動でコーディングする必要があります。

0

あなたのビルドスクリプトは、適切なバージョンのかどうかを検出する必要がありますビルドマシンにcursesが存在します。あなたは結果がiwould馴染みconfigureスクリプトである(例えばGNU Autotool群と、このようなスクリプトを生成することができます。またsh/bashで単純なカスタムスクリプトを書くことができます。

+0

これは学校のプロジェクトのためのものです、私はmakefileとそれを使用するための説明が含まれていますが、教師がVisual Studio/textmateまたはg ++ *ですべての.hと.cppファイルを削除するかもしれないと心配しています。 cppまたは類似のもの。 – everett1992

+0

Windowsマシンにはcursesがインストールされていないと想定するのは安全です。したがって、WIN32が定義されているかどうかを確認してください。その上に、HAVE_CURSESのようなマクロがあるかどうかを調べることができます。定義されていない場合は、Windowsでは0、Unix系の既知のシステムでは1がデフォルトです。教師がWinsowsにcursesをインストールする方法を知っているなら、コンパイラフラグに '-DHAVE_CURSES'を追加することを知っています。 –

+0

私はすでにウィンドウをチェックし、別の関数を実装しています – everett1992

0

あなたが考慮されていない問題は、おそらくあなたのコードということです# includeのncurses.hは、ライブラリがインストールされていなければ動作しません。

+0

両方とも非標準ヘッダーである 'unistd.h'と' term.h' – everett1992

+0

@ everett1992だけが含まれています。特に 'term.h 'はWindowsなどでは利用できません。 – rubenvb

+0

私はウィンドウをチェックし、別の機能を実装します。私はちょうど私の学校のレッドハットコンピュータをコンパイルしようとしました、そしてそれはterm.hについて不平を言ったので、私はより多くの小切手が必要だと思います。 – everett1992

関連する問題