在makefile中使用-lstdc ++

时间:2013-09-18 05:25:50

标签: c++ linker 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 ::的前两个未定义的引用是伪造的,代码可以工作,并且在msgd.cc中正确包含了Server.h。

然而,当我只是做“生成服务器”时,它运行正常,当我做“生成客户端”它运行良好,但我希望能够只做“制造”并让它构建两者。

这是我的makefile。根据{{​​3}}我需要包含-lstdcc ++,但我似乎无法弄清楚如何在makefile中这样做。

# 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 $@ : /g'\'' > $@; \
        [ -s $@ ] || rm -f $@'

include $(OBJS:.o=.d)

2 个答案:

答案 0 :(得分:3)

当你有一个名为msgd的目标文件时,你命名了一个变量msgd.o,然后你把它们混淆了。哦,如果您的目标server实际上没有构建server,则构建msgd

您有一个默认目标(all),可以构建除了您希望构建默认目标之外的其他内容。

如果您不知道如何在命令行上执行此操作,或者您不知道makefile的哪个部分对应于您,那么您想要做某事(即使用-lstdcc++)在命令行上执行。

我建议对makefile进行具体的更改,但你的意图是如此不清楚,我担心我的弊大于利。

答案 1 :(得分:0)

目标是全部需要msgd

all:    msgd Server Data User Message Str msg Client

您没有msgd的规则,但是,可以使用msgdmsgd.o(或您的来源的任何扩展程序)使用msgd.cc制作数字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 $@ ${LDFLAGS} $^ ${LDLIBS} # The rule to compile object files and produce dependencies. %.o : %.cc ${CXX} -o $@ ${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 the built-in rule

  

链接单个目标文件

     

n是通过C编译器运行链接器(通常称为ld)从n.o自动生成的。使用的精确配方是'$(CC)$(LDFLAGS)n.o $(LOADLIBES)$(LDLIBS)'。

您的makefile应该更像以下内容:

{{1}}

请注意,应该没有特定的规则来生成依赖项。依赖关系是作为编译的副产品而产生的。在第一次运行时,依赖项是不必要的,因为无论如何必须构建所有内容,在后续运行中它使用上一次运行的依赖项来确定自那以后发生了什么变化。