linux/g++ 链接的多重定义
linux/g++ Multiple definition on linking
我能够找到的所有相关问题都没有详细说明我的确切情况,所以我希望这不被视为重复的问题。
我有类 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 系统在发现库需要重新构建方面不够完美,如果头文件发生变化。
- g++用户定义的动态链接库上的全局new和delete运算符
- Cmake 链接问题:未定义对 Button::mousePressEvent(QGraphicsSceneMouseE
- 链接 cmake 时出现未定义的引用错误
- 链接阶段出现多重定义错误
- 链接器错误:未定义对"Reference_Genome::seq[abi:cxx11]"的引用
- C++链接时间资源"allocation"而不定义
- Windows 链接器是否使用 LoadLibrary 解析 DLL 中未定义的符号?
- 使用标头保护的多个定义链接错误
- C++不使用"inline"或"static"无类函数的关键字时出现重定义链接错误
- 从自定义链接列表中打印值时,循环陷入无限时
- OpenCV源与CUDA编译生成多个定义链接错误
- 在源文件中定义链接选项C++
- 如果两个静态库包含 pugixml objs,如何避免与 pugixml 的“已定义”链接错误
- 已定义链接器错误
- 来自优化级别的C++多定义链接器错误
- 多重定义:链接时出现错误
- c++多定义链接错误与.h中声明的const
- 使用自定义链接标志构建poco库
- 异步事件:已定义链接器错误[Windows Update API]
- CMake AMRCC + 自定义链接器