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()':

我对此感到很困惑..当我直接用 command 编译它时 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包含函数Bot::getRandomMessage()函数的多重定义,并且多重定义来自源文件中的第 18 行Bot.cpp。现在看下一行:

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

这告诉您 in 中的定义Server.o是一个多重定义,因为 中也有一个定义Bot.o。它还告诉您中的定义Bot.o来自源文件中的第 18 行Bot.cpp,这与其他定义在源中的位置相同。

这意味着Bot.cpp至少编译了两次,一次是 make Server.o,一次是 make Bot.o

那可能不是你想要的。它表明您的某些源文件或头文件Bot.cpp在您打算包含时包含Bot.h,或者您以其他方式Bot.cpp错误地包含。另一种可能性是您有一个编译命令可以编译Bot.cpp为 make Server.o

于 2013-06-09T16:35:56.603 回答
1

通常,当我遇到这样的事情时……它是双重规则出现或项目环境混乱,但是兄弟,这不是生成文件问题。

您将不得不查看代码.....我模拟并测试了您在此处提出的问题的生成文件,其中包含空文件和回显。makefile 似乎工作正常。

  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

我不能根据那里的内容推断出很多建议,srry ...

于 2013-06-09T16:09:08.200 回答
1

当你与g++ main.cpp -Wall -pedantic -Wno-long-long -O0 -ggdb -lncurses -pthread -o AppName你一起编译时,实际上不包括你的Server, Client,BotDummyBot(你在你的 makefile 中)。这就是为什么您看不到该错误的原因。

如果 main.cpp 编译时没有任何其他文件,那么为什么在 makefile 中需要这些客户端、机器人、服务器等?

必须在某个地方重新定义。尝试清理并重新编译。然后检查其报告的功能。像Server.cpp:74, Bot.cpp:18,Bot::getRandomMessage()

同样令人惊讶的是,您的 main.cpp 没有调用任何 Server、Bot ... 函数。如果它调用它应该抛出链接器错误。

于 2013-06-09T16:21:42.110 回答