2011-09-16 22 views
5

Desidero creare la mia applicazione sotto Linux ma non riesco a ottenere il makefile per realizzarlo.
i problemi sono le librerie statiche con cui voglio collegarmi. Ho un sacco di "undefined reference to" i messaggi di errore del tipo:Riferimento non definito nel file makefile Linux

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

o

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

Ecco il mio 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 $< 

Il problema è che non ho idea di makefile. Ho appena copiato uno esistente e ho provato ad adattarlo. Non sembra funzionare, e non riesco a trovare un makefile di esempio che include librerie statiche.

+4

Il makefile è tutto a posto. L'unico errore che stai facendo è che usi il compilatore C per compilare e collegare C++. Il compilatore C++ si chiama 'g ++' (sono in effetti gli stessi tranne per alcuni default, che è il motivo per cui * quasi * funziona). –

+2

Non correlato al tuo problema, ma non dovresti aver bisogno della regola '% .o:% .cpp', dato che make ne ha uno incorporato. È quasi lo stesso, ma include anche' $ (CPPFLAGS) '(flag di preprocessore C). Quindi, a meno che tu non li escluda deliberatamente, otterrai un makefile più "idiomatico" se usi semplicemente la regola implicita. https://www.gnu.org/software/make/manual/make.html è una buona lettura. Il paio di ore necessarie per superare i bit importanti verrà ripagato con meno tempo fissando i makefile increduli dentro, oh, circa 4 ore :-) –

risposta

15

CXX = gcc

Stai collegamento con gcc, piuttosto che g++, quindi -lstdc++ non sia collegata in per impostazione predefinita. Si noti che l'uso di gcc per compilare i sorgenti C++ funziona correttamente, dal momento che g++ viene chiamato implicitamente in questo caso.

3

Se non hai idea di come scrivere Makefile, forse dovresti dare un'occhiata ad alcuni dei generatori di Makefile, ad es. autotools, cmake ecc. Sono molto più facili da usare secondo me e, una volta padroneggiato il loro uso, sono molto più potenti.

Problemi correlati