【发布时间】:2018-08-11 00:13:47
【问题描述】:
我遇到了 c++ 链接问题。我正在尝试为所有其他要使用的文件定义一个 Point2D 结构。在这里。
#ifndef Point2D_h
#define Point2D_h
#include <iostream>
struct Point2D {
float x;
float y;
Point2D(float x, float y) : x(x), y(y) {}
Point2D() : x(0), y(0) {}
Point2D operator+(const Point2D& a) const {
return Point2D(a.x + x, a.y + y);
}
….
};
std::ostream& operator<<(std::ostream& os, const Point2D& m) {
return os << "(" << m.x << ", " << m.y << ")";
}
#endif /* Point2D_h */
唯一的问题是我在尝试构建时收到重复符号 Point2D 错误。我不确定为什么 Point2D 会是一个重复的符号,因为它是受标头保护的
这是我的所有其他文件,无论它们是否受标头保护,是否使用 Point2D,当然还有它们的导入:
Global.h(标头保护)
#include <stdio.h>
#define MAX 9000
引擎核心(标头保护)
#import "Global.h"
#import "Tests/EngineTests.hpp"
#import "Engine/Engine.hpp"
#import "Particle/Particle.hpp"
Tests.cpp(使用 Point2D)
#include "EngineTests.hpp"
#include <iostream>
#include "../Engine/Engine.hpp"
测试.h
#include "Global.h"
Engine.cpp
#include "Engine.hpp"
#include <iostream>
Engine.hpp(标头保护)
#include "Global.h"
#include "../Particle/ParticleManager.hpp"
粒子.cpp
#include "Particle.hpp"
#include <iostream>
Particle.h(标题受保护,使用 Point2D)
#include "Global.h"
#include "../Math/Point.h"
粒子管理器.cpp
#include "ParticleManager.hpp"
#include <iostream>
ParticleManager.h(头文件保护)
#include <stdio.h>
#include "Global.h"
#include "Particle.hpp"
链接器说以下内容
duplicate symbol __ZlsRNSt3__113basic_ostreamIcNS_11char_traitsIcEEEERK7Point2D in:
…/arm64/Particle.o
…larm64/Engine.o
duplicate symbol __ZlsRNSt3__113basic_ostreamIcNS_11char_traitsIcEEEERK7Point2D in:
…/Particle.o
…/arm64/EngineTests.o
duplicate symbol __ZlsRNSt3__113basic_ostreamIcNS_11char_traitsIcEEEERK7Point2D in:
…/arm64/Particle.o
…/ParticleManager.o
ld: 3 duplicate symbols for architecture arm64
【问题讨论】:
-
该错误是针对您的
operator<<函数的。不要在头文件中定义函数。 (此外,标头保护不能防止链接器错误。) -
标头保护阻止标头在一个编译单元(或 cpp 文件,如果您愿意)中多次包含,它们不会阻止在编译其他文件时包含标头。跨度>
-
一种解决方法是在
operator<<的定义中添加关键字inline。另一种解决方法是在标头中声明它,并在 .cpp 文件中提供定义。
标签: c++