gpt4 book ai didi

c++ - linux/g++ 多重定义链接

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:56 24 4
gpt4 key购买 nike

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

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

当我尝试构建我的 main.cpp 以使用#includes 类 A 的 header 的对象 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

A.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

有什么建议吗?

编辑实际错误片段

In function 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: first defined here bin//libtpx2s.a(tpx2s.o): In function 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: first defined here bin//libtpx2s.a(tpx2s.o): In function `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++ 文件链接在一起时,它发现存在导致问题的多个定义。

解决方法(如顶部所述)是将函数标记为内联。这允许链接多个定义。

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

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

关于c++ - linux/g++ 多重定义链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44990113/

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