2011-08-16 14 views
1

私はlibに、文字列のiostreamを使用したアプリケーションのためのmakefileを構築しようとしていると私は今のiostream、文字列とはifstreamライブラリとmakefileをする方法

 CPP  = gcc 
     LIB_DIR  = ./incl 
     PROGRAMS = test 
     PROGS_O  = action_rec.o 
     CPPFLAGS = -I$(LIB_DIR) -pg -g 
     VPATH  = ./src/ 
     OBJFILES = $(VPATH)$(patsubst %.cpp,%.o,$(wildcard *.cpp)) 
     LIBS  = -02 -liostream -lfstream -lstdlib -lstring 

私がしようとするときまでやったfstream.thatですよ私のメイクファイルを使うためには、libの文字列fstreamとiostreamを必要とするものはすべて宣言されていないが、libのstdlibが必要なものはすべて正しく動作する。 誰かが私にその理由を教えてもらえますか? ありがとう

+0

LIBS変数はコンパイラに渡されますか? – rmflow

+0

必要なソースファイルに '#include 'が必要です。リンカー引数として渡すべきではなく、ライブラリではありません。 (非標準のものを使用していない限り) – Mat

答えて

4

すべての-lstring -stdlib -liostream -lfstreamを取り出して修正するかどうかを確認してください。

g ++でコンパイルするので、C++コードをリンクするのに必要な他のものが見つかります。

+0

'iostream'は** libcの**ではありません。 'gcc'の場合はコンパイラ(' libstdC++ ')に付属のライブラリにあります。しかし、 'g ++'を使ってリンクすると、自動的にこれが追加されます。 –

+0

ありがとう:)あなたがコメントしたとき、私は実際に編集していました。 – Owen

0

LIBS = -02 -liostream -lfstream -lstdlib -lstringを簡略化することができます。ちょうどLIBS = -O2を使用してください(あなたは-02ではなく-O2を意味すると思います)。実際には、実際にはリンク段には全く-Oフラグを渡すべきではありません。最適化はコンパイル時のオプションであり、リンク時のオプションではありません。

+0

'-O2'はむしろLIBSの' CPPFLAGS'に入ります。 – RedX

+0

@RedX:そうです。 –

+0

@RedX: '-O2'はプリプロセッサフ​​ラグではなく、コンパイラフラグであるため、' CXXFLAGS'に入ります。 –

1

明らかな問題は、g++ではなくgccとリンクしていることです。 gccは、C++標準ライブラリとリンクしていません。 を手動で追加することはできますが、最も単純なのはg++をすべて使用することです( 実際のCコードがある場合はg++ で終わるコンパイラファイルは C++)。

4

ここには2つの別の問題があります。

C++側: バイナリをC++コードのコンパイルに使用しないでください。代わりにg++を使用してください。これにより、必要なすべての標準インクルードパスとライブラリが自動的に取得されます。

のMakefile側: あなたのMakefileは、多くの問題があります。

  1. コンパイラにCPPを設定しないでください。この変数は、使用するプリプロセッサを定義します。コンパイラを定義するにはCXXを使用してください。とにかくg++に定義されることがよくあります。

  2. 名前がtestのプログラムを作成しないでください。これは標準のUnixプログラム(/usr/bin/test)と衝突し、注意を払わないと間違ったプログラムを呼び出すことになります。

  3. LIBSでリンカーフラグとして-02を渡さないでください。このスイッチはa)間違って単語を付けられています(-O2、文字は0ではありません)。b)コンパイラフラグなので、CXXFLAGSの一部にする必要があります。

  4. メークファイルがまったく必要ない可能性があります。 makeプログラムは、それほど頻繁にあなただけのmain.cppファイルを作成し、これを自動的にmain実行ファイルにコンパイルとリンクmain.cppます

    make main 
    

    を実行することができ、デフォルトのMakefileが付属しています。あなたの場合、何かのようなもの

    CXXFLAGS="-I./incl -pg -g -O2" make main 
    

    十分かもしれません。

+2

巨大な+1:私は覚えているよりも、何年もGNU makeを使用してきました。私はあなた自身のMakefileを動かさずに実行できることを知りませんでした!ありがとう。 – Johnsyweb

関連する問題