FCORE宏用于共享库导出。
这是我的头文件FMath.h
namespace FMath {
// ...
FCORE const float PI_32 = 3.14159265359f; // pi
FCORE inline float Floor(float value) { return floorf(value); }
namespace FConvert {
// ...
FCORE const float DEG_TO_RAD_32 = 0.01745329252f; // pi / 180
FCORE inline float ToRadian(float degree) { return degree * DEG_TO_RAD_32; }
}
}
我的FConvert命名空间中的所有常量值都会导致错误,但不会在FMath中声明。我不明白为什么?
FMeshTraits.obj:-1:错误:LNK2005:已定义DEG_TO_RAD_32 FMesh.obj
编辑:对不起,我没有说我已经使用过这个宏了。
#ifndef FMATH_H
#define FMATH_H
// All of the code is here
#endif
答案 0 :(得分:2)
看起来你有两个.cpp文件FMeshTraits.cpp和FMesh.cpp(行话中两个独立的'翻译单元')。其中每个都被编译成一个单独的.obj文件。
下一步是将这些.obj文件链接到一个可执行文件中。但是 - 如果符号有多个冲突的定义,那么链接器将失败并显示您看到的错误消息。
避免这种情况的通常方法是只在头文件中声明(即声明类型但没有定义),并将所有定义放入.cpp文件中。这样,您在多个.obj文件中永远不会有相同的定义,因此您不会发生链接器冲突。
所以,在FMath.h中你会得到:
FCORE const float DEG_TO_RAD_32;
并且在FMath.cpp中你会:
DEG_TO_RAD_32 = 0.01745329252f;