0

今日はかなり奇妙な問題が発生しました。私はSSE用に最適化された数学ライブラリを持っているので、ほとんどすべての機能がインラインとして宣言されています。簡単にするために、Vector3という1つのクラスのみを使用して問題を説明します。

Vector3はVector3.hで宣言されており、次のようになります。

#ifndef VIRTUS_VECTOR3_H
#define VIRTUS_VECTOR3_H

#ifndef VEC3INLINE
  #if(_DEBUG)
    #define VEC3INLINE inline
  #else
    #define VEC3INLINE __forceinline
  #endif
#endif

namespace Virtus {

struct Vector3
{
  union
  {
    struct { f32 x,y,z; };
    f32 v[3];
  };

  Vector3(void);
  Vector3(const Vector3& rhs);
  Vector3(f32 xx, f32 yy, f32 zz);

  VEC3INLINE Vector3& operator=(const Vector3& rhs);

  VEC3INLINE Vector3 operator+(f32 rhs) const;
  VEC3INLINE Vector3 operator-(f32 rhs) const;
  VEC3INLINE Vector3 operator*(f32 rhs) const;
  VEC3INLINE Vector3 operator/(f32 rhs) const;
  VEC3INLINE Vector3& operator+=(f32 rhs);
  VEC3INLINE Vector3& operator-=(f32 rhs);
...

#include "vector3.inl"
#endif

vector3.inlで、すべての関数の定義に進みます

namespace Virtus {

Vector3::Vector3(void)
  : x(0.0f), y(0.0f), z(0.0f)
{
}

Vector3::Vector3(const Vector3& rhs)
  : x(rhs.x), y(rhs.y), z(rhs.z)
{
}

Vector3::Vector3(f32 xx, f32 yy, f32 zz)
  : x(xx), y(yy), z(zz)
{
    }

VEC3INLINE Vector3& Vector3::operator=(const Vector3& rhs)
{
  memcpy(v, rhs.v, sizeof(v));
  return *this;
}

    ...

次に、すべての数学オブジェクトをmath.hというファイルに含めます。

#ifndef VIRTUS_MATH_H
#define VIRTUS_MATH_H

#include "vector2.h"
#include "vector3.h"
#include "vector4.h"
#include "matrix4.h"
#include "primesearch.h"

namespace Virtus
{
  class MathException
  {
  public:
    enum ErrorCode
    {
      PRIME_SEARCH_INVALID_ELEMENTS,
      PRIME_SEARCH_UNSUFFNUM_PRIMES
    };

    MathException(ErrorCode code) : m_Error(code) {}
    ErrorCode What(void) const { return m_Error; }

  private:
    ErrorCode m_Error;
  };
} // namespace virtus

#endif // Include Guard

math.hは、プリコンパイル済みヘッダーファイル(precompiled.h、別名stdafx.h)に含まれています。

Visual Studio 2008を使用しています。これにより、ビルドプロセスから.inlファイルが自動的に除外されます。

これは私が得ているリンカーエラーです:

エラー1エラーLNK2005: "public:__thiscall Virtus :: Vector3 :: Vector3(void)"(?? 0Vector3 @ Virtus @@ QAE @ XZ)precompiled.objmain.objVirtusで既に定義されています

ビルドからすべてのinlファイルを手動で除外するなど、考えられるあらゆる方法でこれを修正しようとしました。プリコンパイルされたファイルにmath.hを含めず、必要な場合にのみ含めます(この場合、同様の定義済みのリンカーエラーが発生します)。inl拡張子からcpp拡張子への変更など。私がそれを修正することができた唯一の方法は、ガードを含める代わりに#pragmaを一度使用することでした。したがって、現時点での私の最善の推測は、プリコンパイル済みヘッダーファイルとインクルードガードの組み合わせに関係していると思いますが、これを修正する方法はよくわかりません。

助けていただければ幸いです!

4

1 に答える 1

1

vector3.inl 内の各定義は、 で明示的に定義する必要がありますinline

于 2011-06-24T22:51:03.817 に答える