3 向 header 中的 C++ 多重定义错误包括
C++ multiple definition errors in 3-way header include
我有 3 个 header 文件定义 objects:
Point3d.h
#ifndef POINT3D_H
#define POINT3D_H
class Ray3d;
class Vector3d;
#include "Ray3d.h"
#include "Vector3d.h"
class Point3d {
...
};
#endif
Vector3d.h
#ifndef VECTOR3D_H
#define VECTOR3D_H
class Point3d;
class Ray3d;
#include "Ray3d.h"
#include "Point3d.h"
class Vector3d {
...
};
#endif
和Ray3d.h
#ifndef RAY3D_H
#define RAY3D_H
class Point3d;
class Vector3d;
#include "Point3d.h"
#include "Vector3d.h"
class Ray3d {
...
};
#endif
我不会包含 .cpp 文件,但所有函数都在那里定义。
然后我有这个 class:
Transform.h
#ifndef TRANSFORM_H
#define TRANSFORM_H
#include <Eigen/Dense>
#include "../../geometry/Ray3d.cpp"
#include "../../geometry/Point3d.cpp"
#include "../../geometry/Vector3d.cpp"
using Eigen::MatrixXd;
class Transform {
...
};
#endif
最后我有了这个子class:
Translation.h
#ifndef TRANSLATION_H
#define TRANSLATION_H
//#include <Eigen/Dense>
#include "Transform.h"
//#include "../../geometry/Point3d.cpp"
//#include "../../geometry/Vector3d.cpp"
//#include "../../geometry/Ray3d.cpp"
using Eigen::MatrixXd;
class Translation : public Transform {
...
};
#endif
问题是当我尝试编译时 Translation.cpp:
g++ Transform.cpp Translation.cpp
我得到了 Ray3d、Point3d 和 Vector3d 中每个方法的函数错误的多重定义。我该怎么做才能避免这种情况?我应该减少吗?我的 g++ 命令错了吗?谢谢!
我也知道我在前 3 header 中同时进行前向声明和包含,但这是我可以让它们编译的唯一方法。也许是部分问题?
您不应在 transform.h
中包含 cpp 文件
"but that was the only way I could get those to compile. Part of the problem maybe?"
您分别编译 link .cpp
文件,而不是包含它们(即从预处理器中看到)。
你的编译器命令行看起来应该很像
g++ ../../geometry/Ray3d.cpp
../../geometry/Point3d.cpp
../../geometry/Vector3d.cpp
Transform.cpp Translation.cpp
-o MyExecutable
我有 3 个 header 文件定义 objects:
Point3d.h
#ifndef POINT3D_H
#define POINT3D_H
class Ray3d;
class Vector3d;
#include "Ray3d.h"
#include "Vector3d.h"
class Point3d {
...
};
#endif
Vector3d.h
#ifndef VECTOR3D_H
#define VECTOR3D_H
class Point3d;
class Ray3d;
#include "Ray3d.h"
#include "Point3d.h"
class Vector3d {
...
};
#endif
和Ray3d.h
#ifndef RAY3D_H
#define RAY3D_H
class Point3d;
class Vector3d;
#include "Point3d.h"
#include "Vector3d.h"
class Ray3d {
...
};
#endif
我不会包含 .cpp 文件,但所有函数都在那里定义。
然后我有这个 class: Transform.h
#ifndef TRANSFORM_H
#define TRANSFORM_H
#include <Eigen/Dense>
#include "../../geometry/Ray3d.cpp"
#include "../../geometry/Point3d.cpp"
#include "../../geometry/Vector3d.cpp"
using Eigen::MatrixXd;
class Transform {
...
};
#endif
最后我有了这个子class: Translation.h
#ifndef TRANSLATION_H
#define TRANSLATION_H
//#include <Eigen/Dense>
#include "Transform.h"
//#include "../../geometry/Point3d.cpp"
//#include "../../geometry/Vector3d.cpp"
//#include "../../geometry/Ray3d.cpp"
using Eigen::MatrixXd;
class Translation : public Transform {
...
};
#endif
问题是当我尝试编译时 Translation.cpp:
g++ Transform.cpp Translation.cpp
我得到了 Ray3d、Point3d 和 Vector3d 中每个方法的函数错误的多重定义。我该怎么做才能避免这种情况?我应该减少吗?我的 g++ 命令错了吗?谢谢!
我也知道我在前 3 header 中同时进行前向声明和包含,但这是我可以让它们编译的唯一方法。也许是部分问题?
您不应在 transform.h
中包含 cpp 文件"but that was the only way I could get those to compile. Part of the problem maybe?"
您分别编译 link .cpp
文件,而不是包含它们(即从预处理器中看到)。
你的编译器命令行看起来应该很像
g++ ../../geometry/Ray3d.cpp
../../geometry/Point3d.cpp
../../geometry/Vector3d.cpp
Transform.cpp Translation.cpp
-o MyExecutable