gpt4 book ai didi

c++ - 是什么导致 ld : duplicate symbol

转载 作者:搜寻专家 更新时间:2023-10-31 00:44:23 27 4
gpt4 key购买 nike

ld: 重复符号 StringFunctions::intToString(int)

/Build/Intermediates/Y36PJC-mrvikmil.build/Debug/Y36PJC-mrvikmil.build/Objects-normal/x86_64/ServerSocket.o and 
/Build/Intermediates/Y36PJC-mrvikmil.build/Debug/Y36PJC-mrvikmil.build/Objects-normal/x86_64/main.o

对于架构 x86_64

函数 StringFunctions::intToString(int) 位于 StringFunctions.h

包含来自ma​​in.cpp:

#include <iostream>
#include <string>
#include "Exception.h" //does not include anything more
#include "ServerConsole.h"
/*
which includes ServerSocket.h which includes ClientSocket.h which includes StringFunctions.h
AND
ServerSocket.h includes SocketException.h which includes StringFunctions.h
*/

包含来自ServerSocket.cpp:

#include <iostream>
#include <string>
#include "InvalidPortException.h" //does not include anything more
#include "SocketException.h" //which includes StringFunctions.h
#include "ClientSocket.h" //which includes SocketException.h which includes StringFunctions.h
#include "StringFunctions.h" //StringFunctions.h

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <errno.h>

我相信只要我在 .h 文件中有东西,我就可以在任何地方包含几乎任何东西......

我所有的文件都包含 guard (#ifndef ... #define ...)

请帮忙。

最佳答案

您必须将函数定义为 inline 或将其实现移动到 cpp 文件中。否则它将同时存在于两个对象中,而 C++ 将不知道要链接哪一个(尽管它们是相同的)。

包含守卫将避免在同一代码文件/对象中多次使用相同的 header 。然而,他们不会避免在多个目标文件中使用相同的代码,因为每个目标文件都是自己创建的,所有定义都已重置。

关于c++ - 是什么导致 ld : duplicate symbol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8878101/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com