2012-04-24 36 views
0

異なるディレクトリに異なるソースファイルからのMakefileでコンパイルすることはできませんleveldb.hpp "。 leveldb.cppには "leveldb.hpp"が含まれていますは、私は、このディレクトリ構造を持つC++プロジェクトを持っている

私のMakefileはこれまでのところです。$ LEVELDBはGoogleのleveldbライブラリへのパスであり、leveldb.hppとcppファイルとは異なります。カスタムメイドクラス):

CC=g++ 
LEVELDB=/route/to/Googles/library/leveldb 
BOOST=/route/to/boost/cpp-netlib-0.9.2 

DATABASE=/route/to/my/project/src/database 

CFLAGS=-I$(LEVELDB)/include -I$(BOOST) -Wall -O2 
LDFLAGS=-L$(LEVELDB) -lleveldb -lpthread -lboost_system -lboost_thread -pthread 

all:server 

server: server.cpp database/leveldb.cpp 
    $(CC) -o [email protected] $(CFLAGS) -I$(DATABASE) $< $(LDFLAGS) -L$(DATABASE) 

私はそれをコンパイルすることはできません。それは私に "LevelDB :: LevelDB(std :: basic_string、std :: allocator>)への定義されていない参照"というエラーを私に与えます。私が知っているのは、Makefileのためにコンパイルエラーです。 1つのソースファイル。

私はあなたの助けに感謝します。

感謝:)

+0

'servidor'は、cppファイルの代わりに' server.o'のようないくつかのオブジェクトファイルに依存すべきではありませんか? .cppを.oに置き換えると、makeはオブジェクトファイルを生成します。 –

+0

データベースディレクトリに何かを構築していますか?あなたが '-L $(DATABASE)'を持っているからです。 – juanchopanza

+1

Makeは実行している全てのコマンド行を正確に表示します。そのため、GCCの呼び出し方法がわかります。それがGCCの呼び出し方法と一致しない場合は、Makefileを修正してください。 –

答えて

2

あなたはmake(またはmake allまたはmake server)またはmake servidorしようとしているかどうかを私たちに語っていません。いずれにしても、問題はleveldb定義をターゲットにリンクしていないことです。このルールでは

:あなたが最初前提条件を意味する自動変数$<を使用している

servidor: server.cpp database/leveldb.cpp 
    $(CC) -o [email protected] $(CFLAGS) -I$(DATABASE) $< $(LDFLAGS) -L$(DATABASE) 

、(server.cpp)。 $^、つまりすべて前提条件(server.cpp database/leveldb.cpp)を使用する必要があります。

あなたmakeまたはmake allまたはmake server場合は、leveldb.cppの言及をしないデフォルトの規則を使用してserver.cppからserverを構築しようとしてください。ルールを「すべて:servidor」にしたくないのですか?

+1

+1欠けているのは[参考資料へのリンク]です(http://www.gnu.org/software/make/manual/make.html#Automatic-Variables)。 –

+0

申し訳ありませんが、私はエラーがありました。 「Servidor」は「サーバー」です。私はすでにそれを修正しました。 server.cppをビルドしたいと思います。 –

+0

@Robᵩ、あなたは大丈夫です、ありがとう。 – Beta

関連する問題