我正在使用Xcode构建一个C项目,当我构建它时,它给了我这个错误:
ld: duplicate symbol _detectLinux in /Users/markszymanski/Desktop/Programming/C/iTermOS/build/iTermOS.build/Debug/iTermOS.build/Objects-normal/i386/linuxDetect.o and /Users/markszymanski/Desktop/Programming/C/iTermOS/build/iTermOS.build/Debug/iTermOS.build/Objects-normal/i386/iTermOS.o
谢谢!
答案 0 :(得分:1)
这意味着你已经在(至少)两个不同的源文件中定义了具有全局作用域的相同符号 - 一个函数或一个名为_detectLinux
的全局变量,显然在文件linuxDetect.c
中iTermOS.c
。
如何修复它取决于您打算如何使用此符号:
如果您打算在一个文件中定义它并在另一个文件中使用它,请在另一个文件中声明extern
。
如果您只打算在声明它的文件中使用该符号,则可以声明它static
。
如果在两个文件中都定义了符号,则可以在一个(或两个)文件中重命名该符号。
答案 1 :(得分:1)
如果_detectLinux是一个函数,解决此问题的一种常见方法是在头文件中定义它,但忘记将其标记为内联。这将导致它在包含标题的每个文件中生成功能代码(可能是_detectLinux.c和iTermsOS.c)。
或许你可以在两个源文件之间复制粘贴函数的整个主体,而不是简单地在iTermsOS.c中声明我希望它被调用的函数。
答案 2 :(得分:0)
嗯,这不是很多信息。如错误所示,符号_detectLinux包含在linuxDetect.o和iTermsOS.o中,当您尝试将它们链接在一起时,由于链接器不知道要使用哪两个符号,因此存在冲突。例如,如果您在.h文件中有一个具有该名称的全局变量,可能会发生这种情况,该文件用于构建两个文件而不是在一个地方声明它并在.h文件中将其声明为“extern”。
你需要做的是查看最初声明符号_detectLinux的位置,然后浏览linuxDetect.o和iTermOS.o的依赖关系,看看为什么它被公开包含在两者中。