2011-09-16 14 views
5

Quiero construir mi aplicación en Linux pero no puedo hacer que mi archivo MAKE lo haga.
los problemas son las bibliotecas estáticas con las que quiero vincular. Tengo un montón de "referencia indefinida a" mensajes de error como:Referencia indefinida en el archivo MAKE de 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*)' 

Aquí es mi 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 $< 

El problema es que no tengo ni idea de makefiles. Acabo de copiar una existente e intenté ajustarla. Parece que no funciona, y no puedo encontrar un archivo MAKE de ejemplo que incluya bibliotecas estáticas.

+4

El archivo MAKE está bien y está bien. El único error que está cometiendo es que usa el compilador C para compilar y vincular C++. El compilador de C++ se llama 'g ++' (en realidad son los mismos excepto por unos pocos valores predeterminados, por lo que * casi * funciona). –

+2

No relacionado con su problema, pero no debería necesitar la regla '% .o:% .cpp', ya que make tiene una integrada. Es casi lo mismo, pero también incluye' $ (CPPFLAGS) '(banderas de preprocesador C) A menos que los excluya deliberadamente, obtendrá un archivo make "idiomático" si usa la regla implícita. https://www.gnu.org/software/make/manual/make.html es una buena lectura. El par de horas que demora en atravesar los bits importantes se amortizará con menos tiempo mirando incrédulos a makefiles dentro de, oh, unas 4 horas :-) –

Respuesta

15

CXX = gcc

está enlazando con gcc, en lugar de g++, por lo -lstdc++ no está vinculado de forma predeterminada. Tenga en cuenta que el uso de gcc para compilar fuentes C++ funciona bien, ya que g++ se llama implícitamente en ese caso.

3

Si no tiene idea de cómo escribir Makefiles, tal vez debería echar un vistazo a algunos de los generadores de Makefile, p. autotools, cmake, etc. En mi opinión, son mucho más fáciles de usar y, una vez que dominas su uso, son mucho más potentes.