1

Makefile を使用して C++ プロジェクトをコンパイルしようとすると、次のようなエラーが発生し続けます。

Server.o: In function `Bot::getRandomMessage()':
/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Bot.cpp:18: multiple definition of `Bot::getRandomMessage()'
Bot.o:/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Bot.cpp:18: first defined here
Server.o: In function `Bot':
/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Bot.cpp:27: multiple definition of `Bot::Bot()'
Bot.o:/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Bot.cpp:27: first defined here
Server.o: In function `~Bot':
/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Bot.cpp:30: multiple definition of `Bot::~Bot()'
Bot.o:/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Bot.cpp:30: first defined here
Server.o: In function `~Bot':
/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Bot.cpp:30: multiple definition of `Bot::~Bot()'
Bot.o:/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Bot.cpp:30: first defined here
Server.o: In function `~Bot':
/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Bot.cpp:30: multiple definition of `Bot::~Bot()'
Bot.o:/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Bot.cpp:30: first defined here
Server.o: In function `Bot::getName()':
/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Bot.cpp:33: multiple definition of `Bot::getName()'
Bot.o:/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Bot.cpp:33: first defined here
Server.o: In function `ChatRoom::getCurrentTime()':
/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Server.cpp:74: multiple definition of `ChatRoom::getCurrentTime()'
main.o:/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Server.cpp:74: first defined here
Server.o: In function `Bot::getRandomMessage()':
/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Bot.cpp:18: multiple definition of `vectorOfThreads'
main.o:/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Server.cpp:74: first defined here
Server.o: In function `Bot::getRandomMessage()':

私はそれとかなり混乱しています..コマンドで直接コンパイルすると、 g++ main.cpp -Wall -pedantic -Wno-long-long -O0 -ggdb -lncurses -pthread -o AppNameエラーは発生しません。だから私は、エラーが私のどこかに表示されることを期待していますMakefile

#macros
Remove=rm -rf
Doxygen=Doxyfile
RUN=./dvoram64
FLAGS=-Wall -pedantic -Wno-long-long -O0 -ggdb -pthread -lncurses -g
OBJECTS=main.o Bot.o Server.o Client.o GrumpyBot.o JokerBot.o WeatherBot.o DummyBot.o

#generates final binary and documentation
all:    $(Doxygen)
    make compile

#build into final binary
compile: $(RUN)

#run program
run:    
    make link
    $(RUN)
    $(RUN)


clean:
    $(Remove) dvoram64
    $(Remove) $(OBJECTS)

#generate documentation in '<login>/doc' folder
doc: $(Doxygen) /*
    ( cd ./ | doxygen $(Doxygen))

link: $(OBJECTS)
    g++ $(OBJECTS) -lncurses -pthread -o dvoram64

#rules how to compile into the executalble file
$(RUN): $(OBJECTS)

Bot.o: ./Bot.cpp ./Bot.h
    g++ $(FLAGS) -c ./Bot.cpp

DummyBot.o: ./DummyBot.cpp ./DummyBot.h ./Bot.h
    g++ $(FLAGS) -c ./DummyBot.cpp

GrumpyBot.o: ./GrumpyBot.cpp ./GrumpyBot.h ./Bot.h
    g++ $(FLAGS) -c ./GrumpyBot.cpp

JokerBot.o: ./JokerBot.cpp ./JokerBot.h ./Bot.h
    g++ $(FLAGS) -c ./JokerBot.cpp

WeatherBot.o: ./WeatherBot.cpp ./WeatherBot.h ./Bot.h
    g++ $(FLAGS) -c ./WeatherBot.cpp

Client.o: ./Client.cpp
    g++ $(FLAGS) -c ./Client.cpp


main.o: ./main.cpp 
    g++ $(FLAGS) -c ./main.cpp

Server.o: ./Server.cpp ./Bot.h ./JokerBot.h ./WeatherBot.h ./GrumpyBot.h ./DummyBot.h
    g++ $(FLAGS) -c ./Server.cpp

このエラーの原因と修正方法を教えてください。

4

3 に答える 3

3

エラーメッセージが何を伝えているかを見てください。最初の行から始めます。

Server.o: In function `Bot::getRandomMessage()':
/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Bot.cpp:18: multiple definition of `Bot::getRandomMessage()'

このメッセージは、オブジェクト ファイルServer.oに関数 function の複数の定義が含まれておりBot::getRandomMessage()、その複数の定義がソース ファイルの 18 行目にあることを示していますBot.cpp。次の行を見てください。

Bot.o:/home/ubuntu/NetBeansProjects/SemestralniPraceChat/./Bot.cpp:18: first defined here

これは、 にServer.oも定義があるため、 の定義が多重定義であることを示していますBot.o。また、 の定義がBot.oソース ファイルの 18 行目にあることもわかりますBot.cpp。これは、ソース内の他の定義と同じ場所です。

これはBot.cpp少なくとも 2 回コンパイルされたことを意味しServer.oますBot.o

それはおそらくあなたが望むものではありません。Bot.cppをインクルードするつもりだったときにソース ファイルまたはヘッダー ファイルの一部がインクルードさBot.hれているか、または別の方法でBot.cpp誤ってインクルードしたことを示唆しています。Bot.cpp別の可能性として、 makeにコンパイルされるコンパイル コマンドがある可能性がありますServer.o

于 2013-06-09T16:35:56.603 に答える
1

一般的に、私がこのようなことに直面したとき......その二重ルールの発生またはプロジェクト環境が台無しになっていますが、ブロ、これはメイクファイルの問題ではありません。

コードを調べる必要があります..... ここで質問に入力したメイクファイルを、空のファイルとエコーでシミュレートおよびテストしました。メイクファイルは問題なく動作しているようです。

  Kaizen ~/so_test $ make -nf mk.t2
  make compile

  Kaizen ~/so_test $ make -nf mk.t2 compile
   echo g++ -Wall -pedantic -Wno-long-long -O0 -ggdb -pthread -lncurses -g -c ./main.cpp
   echo g++ -Wall -pedantic -Wno-long-long -O0 -ggdb -pthread -lncurses -g -c ./Bot.cpp
   echo g++ -Wall -pedantic -Wno-long-long -O0 -ggdb -pthread -lncurses -g -c ./Server.cpp
   echo g++ -Wall -pedantic -Wno-long-long -O0 -ggdb -pthread -lncurses -g -c ./Client.cpp
   echo g++ -Wall -pedantic -Wno-long-long -O0 -ggdb -pthread -lncurses -g -c ./GrumpyBot.cpp
   echo g++ -Wall -pedantic -Wno-long-long -O0 -ggdb -pthread -lncurses -g -c ./JokerBot.cpp
   echo g++ -Wall -pedantic -Wno-long-long -O0 -ggdb -pthread -lncurses -g -c ./WeatherBot.cpp
   echo g++ -Wall -pedantic -Wno-long-long -O0 -ggdb -pthread -lncurses -g -c ./DummyBot.cpp

そこにあるものに基づいて多くの提案を推測することはできません、すみません...

于 2013-06-09T16:09:08.200 に答える
1

g++ main.cpp -Wall -pedantic -Wno-long-long -O0 -ggdb -lncurses -pthread -o AppName実際にコンパイルするときは、、、などを含めないServerでください(メイクファイルに含まれています)。そのため、そのエラーは表示されません。ClientBotDummyBot

また、main.cpp が他のファイルなしでコンパイルされる場合、なぜこれらのクライアント、ボット、サーバーなどが makefile に必要なのですか?

どこかに再定義があるはずです。クリーンアップして再コンパイルしてみてください。次に、そのレポート機能を確認します。のようServer.cpp:74Bot.cpp:18、、Bot::getRandomMessage()

また驚くべきことに、あなたの main.cpp は Server、Bot ... 関数を呼び出しません。呼び出した場合、リンカー エラーがスローされるはずです。

于 2013-06-09T16:21:42.110 に答える