1

ここに私のエラーがあります

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:: への最初の 2 つの未定義の参照は偽物ですが、コードは機能し、Server.h は msgd.cc に正しく含まれています。

ただし、単純に「サーバーを作成」すると正常に動作し、「クライアントを作成」すると正常に動作しますが、「メイク」を実行して両方をビルドできるようにしたいと考えています。

これが私のメイクファイルです。https://stackoverflow.com/a/10907227/2080104によると、-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)
4

2 に答える 2

3

msgdという名前のオブジェクト ファイルがあったときに、変数に名前を付けmsgd.oてから、それらを混同してしまいました。ああ、server実際にはビルドしないターゲットがありますが、serverビルドしますmsgd

デフォルトのターゲット ( all) があり、デフォルトのターゲットでビルドしたいもの以外のものをビルドします。

-lstdcc++コマンド ラインでの実行方法がわからない場合や、コマンド ラインでの実行に対応する makefile の部分がわからない場合に、何かを実行する (つまり、 を使用する) ことが必要です。

makefile に特定の変更を加えることをお勧めしますが、あなたの意図があまりにも不明確なので、私は良いことよりも悪いことをしてしまうのではないかと心配しています。

于 2013-09-18T05:34:47.363 に答える