2011-09-16 24 views
5

私はlinuxで自分のアプリケーションをビルドしたいのですが、メイクファイルを作ることができません。
問題はリンクする静的ライブラリです。ここでLinuxのメイクファイルで未定義のリファレンス

undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()' 

または

undefined reference to `cgicc::Cgicc::Cgicc(cgicc::CgiInput*)' 

私のメイクです:

CXX = gcc 

INCL_CGICC = ../cgicc-3.2.9 
INCL_OPENSSL = ../openssl-1.0.0e/include 
INCL_LOG4CPLUS = ../log4cplus-1.0.4/include 
INCL_BOOST = ../boost_1_46_1 
INCLUDES = -I$(INCL_CGICC) -I$(INCL_OPENSSL) -I$(INCL_LOG4CPLUS) -I$(INCL_BOOST) 

CXXFLAGS = -Wall -D_LINUX -DVERSNUM=2 -DVERSMAJOR=0 -DVERSMINOR=0 $(INCLUDES) 

TARGET = myapp 
OBJS = Main.o 

all: $(TARGET) 
strip -s $< 
mv -f $< release 

$(TARGET): $(OBJS) 
$(CXX) -static -o [email protected] $(OBJS) \ 
      ../cgicc-3.2.9/cgicc/.libs/libcgicc.a \ 
      ../openssl-1.0.0e/libssl.a \ 
      ../openssl-1.0.0e/libcrypto.a \ 
      ../log4cplus-1.0.4/src/.libs/liblog4cplus.a \ 
      -ldl -lpthread 

%.o: %.cpp 
$(CXX) $(CXXFLAGS) -c $< 

問題は、私は見当がつかないということである私のようなエラー・メッセージ「への未定義参照」の多くを得ますメイクファイル。私はちょうど既存のものをコピーし、それを調整しようとしました。動作していないようで、静的ライブラリを含むサンプルのmakefileが見つかりません。

+4

メイクファイルはすべて上質です。唯一の間違いは、Cコンパイラを使ってC++をコンパイルしてリンクすることです。 C++コンパイラは 'g ++ 'と呼ばれています(いくつかのデフォルトを除いて実際は同じです。 –

+2

あなたの問題とは無関係ですが、 '%.o:%.cpp'ルールは必要ありません。makeには1つが組み込まれているので、ほとんど同じですが、' $(CPPFLAGS) '(Cプリプロセッサフ​​ラグ)。故意にそれらを除外しない限り、あなたは単に暗黙のルールを使用すれば、より "慣用的な" makefileを得るでしょう。 https://www.gnu.org/software/make/manual/make.htmlはうまく読まれます。重要なビットをスロッグするのにかかる時間は、あまり時間をかけずに、約4時間以内に不信のメイクファイルを見て返済されます:-) –

答えて

15

CXX = gcc

あなたはそう-lstdc++は、デフォルトでリンクされていない、gccはなく、g++とリンクしています。 gccを使用してC++ソースをコンパイルすると、正常に動作することに注意してください。その場合、g++が暗黙的に呼び出されるためです。

3

Makefileを書く手がかりがない場合は、Makefileのいくつかを見てみるべきでしょう。 autotools、cmakeなど。これらは私の意見でははるかに使いやすく、いったん使い方をマスターすると、はるかに強力です。

関連する問題