2011-09-16 47 views
5

我想在linux下構建我的應用程序,但是我無法讓我的makefile生成它。
問題是我想鏈接的靜態庫。我得到了很多的「未定義的引用」錯誤信息,如:Linux makefile中未定義的引用

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

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

這裏是我的makefile:

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有一個內建的。它幾乎相同,但它也包括'$(CPPFLAGS)'(C預處理器標誌)。所以除非你故意排除這些,否則如果你只是使用隱式規則,你會得到一個更「慣用」的makefile。 https://www.gnu.org/software/make/manual/make.html是一個很好的閱讀。幾個小時花費在重要的部分上的時間將會通過更少的時間在難以置信的內部盯着makefile而得到償還,哦大約4個小時:-) –

回答

15

CXX = gcc

你跟gcc,而不是g++連接,所以-lstdc++默認情況下不鏈接英寸 請注意,使用gcc來編譯C++源工作得很好,因爲在這種情況下g++被隱式調用。

3

如果您對編寫Makefiles沒有任何線索,也許您應該查看一些Makefile生成器,例如, autotools,cmake等。這些在我看來更容易使用,而且一旦你掌握了它們的使用,就會更加強大。