linux/g++ 链接的多重定义

linux/g++ Multiple definition on linking

本文关键字:定义 链接 g++ linux      更新时间:2023-10-16

我能够找到的所有相关问题都没有详细说明我的确切情况,所以我希望这不被视为重复的问题。

我有类 A(使用 A.h 声明和 A.cpp 定义(,它包含和使用来自 Math.h 的函数。

当我尝试构建我的 main.cpp 使用 #includes 类 A 标头的对象 A 时,对于 Math.h 中定义的每个数学函数,我都会收到多重定义错误(Math.h 没有.cpp,所有函数/变量都在标头中定义(。

#ifndef A_H
#define A_H
#include "Math.h"
//Other #includes
namespace MY_NAMESPACE
{
class A
{
public:
A();
//Variable/Function declarations
private:
//Variable/Function declarations
};
}
#endif

答.cpp

#include "A.h"
void MY_NAMESPACE::A::Func1()
{
//define
}
ect...

主.cpp

#include "A.h"

int main()
{
MY_NAMESPACE::A* a = new MY_NAMESPACE::A();
delete a;
return 0;
}

Math.h(仅在标头中声明和定义(

#ifndef MATH_H
#define MATH_H
float DotProduct(Vector3 v1, Vector3 v2)
{
return (v1.x * v2.x) + (v1.y * v2.y) + (v1.z * v2.z);
}
#endif
etc...

我是 linux/g++ 的新手。这在过去从未在Windows平台上的Visual Studio中编程时引起任何问题。

这是非常基本的东西,所以我相当困惑。

生成文件

CC=g++ FLAGS=-std=c++11 -g

build: clean A.o main
clean:
rm -f -v bin/*.*
A.o:
$(CC) -c $(FLAGS) A.cpp
main:
$(CC) $(FLAGS) main.cpp A.o

有什么建议吗?

编辑实际错误截图。

在函数WF_RPI::MATH::Normalize(WF_RPI::MATH::Vector3)': /home/pi/projects/WFRPI/TPx2SController/../WFStandard/WFSMath.h:574: multiple definition of WF_RPI::MATH::Normalize(WF_RPI::MATH::Vector3(' Arcus.o:/home/pi/projects/WFRPI/Arcus/../TPx2SController/../WFStandard/WFSMath.h:574: 首先在这里定义 bin//libtpx2s.a(tpx2s.o(: 在函数中WF_RPI::MATH::Normalize(WF_RPI::MATH::Vector2)': /home/pi/projects/WFRPI/TPx2SController/../WFStandard/WFSMath.h:590: multiple definition of WF_RPI::MATH::Normalize(WF_RPI::MATH::Vector2(' Arcus.o:/home/pi/projects/WFRPI/Arcus/../TPx2SController/../WFStandard/WFSMath.h:590: 首先在这里定义 bin//libtpx2s.a(tpx2s.o(: 在函数中 'WF_RPI::MATH::Magnitude(WF_RPI::MATH::Vector2(':

Math.h 中的函数需要内联...

inline float DotProduct(Vector3 v1, Vector3 v2)
{ 
return (v1.x * v2.x) + (v1.y * v2.y) + (v1.z * v2.z);
}

C/C++ 当前对包含文件使用文本插入。 这意味着对于每个.cpp文件,它由其所有包含的所有文本及其自己的代码组成。

当编译器看到

int funName( int param ) {
// something...
}

它声明一个外部函数。 当它将C++文件链接在一起时,它会发现有多个定义导致问题。

修复(如顶部右侧所述(是将函数标记为inline. 这允许链接多个定义。

该错误描述的问题比您描述的要复杂得多。 它提到了一个存档(.a(文件,该文件具有重复的定义,头文件WFSMath.h

归档文件需要重建,因为它可能嵌入了非内联实现,并且有些 make 系统在发现库需要重新构建方面不够完美,如果头文件发生变化。