2013-09-18 4 views
1

вот моя ошибкаиспользование -lstdC++ в Makefile

make 
cc msgd.o -o msgd 
msgd.o: In function `main': 
/home/cam/Desktop/lab1/msgd.cc:37: undefined reference to `Server::Server(int, bool)' 
/home/cam/Desktop/lab1/msgd.cc:39: undefined reference to `Server::~Server()' 
msgd.o: In function `__static_initialization_and_destruction_0': 
/usr/include/c++/4.7/iostream:75: undefined reference to `std::ios_base::Init::Init()' 
/usr/include/c++/4.7/iostream:75: undefined reference to `std::ios_base::Init::~Init()' 
msgd.o:(.eh_frame+0x13): undefined reference to `__gxx_personality_v0' 
collect2: error: ld returned 1 exit status 
make: *** [msgd] Error 1 

Первые два неопределенные ссылки на сервер :: являются поддельными, код работает и server.h правильно включен в msgd.cc.

Однако, когда я просто делаю «сервер», он работает нормально, и когда я делаю «клиент», он работает нормально, но я хочу иметь возможность просто «сделать» и построить его как.

Вот мой makefile. Согласно https://stackoverflow.com/a/10907227/2080104 мне нужно включить -lstdcC++, но я не могу понять, как это сделать в make-файле.

# Makefile for socket examples 

CXX=   g++ $(CCFLAGS) 
msgd=   msgd.o Server.o Data.o User.o Message.o Str.o 
msg=   msg.o Client.o Str.o 
OBJS =   $(msgd) $(msg) 


CCFLAGS= -std=c++11 -g 

all: msgd Server Data User Message Str msg Client 

server:$(msgd) 
    $(CXX) -o msgd $(msgd) 

client:$(msg) 
    $(CXX) -o msg $(msg) 

clean: 
    rm -f $(OBJS) $(OBJS:.o=.d) 

realclean: 
    rm -f $(OBJS) $(OBJS:.o=.d) msgd msg 


# These lines ensure that dependencies are handled automatically. 
%.d: %.cc 
    $(SHELL) -ec '$(CC) -M $(CPPFLAGS) $< \ 
     | sed '\''s/\($*\)\.o[ :]*/\1.o [email protected] : /g'\'' > [email protected]; \ 
     [ -s [email protected] ] || rm -f [email protected]' 

include $(OBJS:.o=.d) 
+0

Ват ошибка, которую вы получаете? – shofee

+0

Помимо хорошего совета ниже, вы должны _never_ добавить '-lstdC++' в свою линию ссылок. Ответ SO, на который вы ссылаетесь, рекомендует просто ссылаться на C++ ('g ++'), а не на C ('gcc'). Если вы свяжетесь с 'g ++', то поймете, что вы пытаетесь связать код на C++ и автоматически добавляете все нужные вам библиотеки, в том числе '-lstdC++', в правильном порядке. Очень сложно получить это право самостоятельно, поэтому просто не делайте этого, если у вас нет чрезвычайно сложных требований к привязке, которые его задают. – MadScientist

ответ

3

Вы назвали переменную msgd когда вы имели объектный файл с именем msgd.o, а затем вы получили путаете. О, и у вас есть цель server, которая на самом деле не построена server, она строит msgd.

У вас есть цель по умолчанию (all), которая строит объекты, отличные от того, что вы хотите создать по умолчанию.

Вы хотите сделать что-то (то есть использовать -lstdcc++), когда либо вы не знаете, как это сделать в командной строке, либо вы не знаете, какая часть файла makefile соответствует тому, что вы делаете на командная строка.

Я бы предложил конкретные изменения в make-файле, но ваши намерения настолько неясны. Боюсь, что я причиню больше вреда, чем пользы.

0

Что происходит, так это то, что цель все требует msgd.

all: msgd Server Data User Message Str msg Client 

У вас нет правила для msgd, однако, сделать фигуры можно построить msgd из msgd.o от msgd.cc (или любого расширения ваш источник имеет) с помощью the built-in rule:

Linking один объект file

n автоматически создается из-за отсутствия компоновщика (обычно называемого ld) с помощью компилятора C. Используемый точный рецепт - $ (CC) $ (LDFLAGS) n.o $ (LOADLIBES) $ (LDLIBS) '.

Ваш Makefile должен выглядеть так:

CXX := g++ 
CXXFLAGS := -std=c++11 -g 
CPPFLGS := 
LDFLAGS := 
LDLIBS := -g 

all : msgd msg 

msgd_obj := msgd.o Server.o Data.o User.o Message.o Str.o 
msg_obj := msg.o Client.o Str.o 
OBJ := ${msgd_obj} ${msg_obj} 

msgd : ${msgd_obj} 
msg : ${msg_obj} 

# The rule to link the executables. 
msgd msg : 
    ${CXX} -o [email protected] ${LDFLAGS} $^ ${LDLIBS} 

# The rule to compile object files and produce dependencies. 
%.o : %.cc 
    ${CXX} -o [email protected] ${CPPFLAGS} ${CXXFLAGS} -MD -MP $< 

clean: 
    rm -f $(OBJS) $(OBJS:.o=.d) 

realclean: 
    rm -f $(OBJS) $(OBJS:.o=.d) msgd msg 

-include $(OBJS:.o=.d) 

.PHONY: all clean realclean 

Обратите внимание, что не должно быть конкретное правило, для получения зависимостей. Зависимости производятся как побочный продукт компиляции. В первом запуске зависимости не нужны, потому что все должно быть построено в любом случае, при последующих запусках он использует зависимости от предыдущего прогона, чтобы определить, что изменилось с тех пор.

Смежные вопросы