Я работаю над игровым движком и пытаюсь экспортировать объединение, но каким-то образом получаю следующую ошибку:
Определение функции dllimport не разрешено
Теперь я знаю, что означает эта ошибка, и решил ее раньше, но в этом случае я не могу найти ответ.
Я объявляю dllexport / dllimport следующим образом:
// Core.h
#ifdef CH_PLATFORM_WINDOWS
#ifdef CH_BUILD_DLL
#define CH_API __declspec(dllexport)
#else
#define CH_API __declspec(dllimport)
#endif // CH_BUILD_DLL
#else
#error Cheetah currently only supports windows!
#endif // CH_PLATFORM_WINDOWS
Я использую этот макрос уже находится в нескольких местах, и эти классы, структуры и объединения экспортируются / импортируются так, как они должны, например:
// Vector4.h
#ifndef CHEETAH_ENGINE_MATH_VECTOR4_H_
#define CHEETAH_ENGINE_MATH_VECTOR4_H_
#include "Core/Core.h"
#include "Vector3.h"
namespace cheetah
{
template<typename T>
union CH_API Vector4
{
inline Vector4();
inline Vector4(const T& fill);
inline Vector4(const T fill[4]);
inline Vector4(const Vector3<T>& fill, const T& w);
inline Vector4(const T& x, const T& y, const T& z, const T& w);
struct
{
T x, y, z, w;
};
inline const T* get() const;
inline T magnitude() const;
inline void operator *= (const T& rhs);
inline void operator += (const T& rhs);
inline void operator -= (const T& rhs);
inline void operator /= (const T& rhs);
inline Vector4<T> operator + (const Vector4<T>& rhs) const;
inline Vector4<T> operator - (const Vector4<T>& rhs) const;
inline T operator * (const Vector4<T>& rhs) const;
private:
struct
{
T m_data[4];
};
};
template union CH_API Vector4<float>;
template union CH_API Vector4<int>;
template union CH_API Vector4<double>;
using Vector4f = Vector4<float>;
using Vector4i = Vector4<int>;
using Vector4d = Vector4<double>;
}
#include "Vector4.inl"
#endif // !CHEETAH_ENGINE_MATH_VECTOR_H_
Но каким-то образом союз Quaternion не экспортируется, хотя он очень так же, как объединение Vector4.
// Quaternion.h
#ifndef CHEETAH_CORE_MATH_QUATERNION_H_
#define CHEETAH_CORE_MATH_QUATERNION_H_
#include "Vector4.h"
#include "Vector3.h"
#include "Mat4x4.h"
#include<math.h>
#include "Core/Core.h"
namespace cheetah
{
template<typename T>
union CH_API Quaternion
{
public:
Quaternion();
Quaternion(const T& axisX, const T& axisY, const T& axisZ, const T& degrees);
Quaternion(const Vector3<T>& axis, const T& degrees);
Quaternion(const T fill[4]);
struct
{
T axisX, axisY, axisZ, degrees;
};
inline const T* get() const;
inline Mat4x4<T> getMatrix() const;
inline void normalize();
inline Quaternion<T> normalize(const Quaternion<T>& vector) const;
inline void operator *= (const T& rhs);
inline void operator += (const T& rhs);
inline void operator -= (const T& rhs);
inline void operator /= (const T& rhs);
inline Quaternion<T> operator + (const Vector4<T>& rhs) const;
inline Quaternion<T> operator - (const Vector4<T>& rhs) const;
inline T operator * (const Vector4<T>& rhs) const;
private:
struct
{
T m_data[4];
};
};
template union CH_API Quaternion<float>;
template union CH_API Quaternion<int>;
template union CH_API Quaternion<double>;
using Quaternionf = Quaternion<float>;
using Quaternioni = Quaternion<int>;
using Quaterniond = Quaternion<double>;
}
#include "Quaternion.inl"
#endif // !CHEETAH_CORE_MATH_QUATERNION_H_
Ошибка генерируется во всех конструкторах объединения Quaternion в файле реализации Quaternion.inl, который содержит все реализации Quaternion.
// Quaternion.inl
namespace cheetah
{
template<typename T>
inline Quaternion<T>::Quaternion()
: m_data{ 0, 0, 0, 0 }
{
}
template<typename T>
inline Quaternion<T>::Quaternion(const T& axisX, const T& axisY, const T& axisZ, const T&
degrees)
: m_data{ axisX, axisY, axisZ, degrees }
{
}
template<typename T>
inline Quaternion<T>::Quaternion(const Vector3<T>& axis, const T& degrees)
: m_data{ axis.x, axis.y, axis.z, degrees }
{
}
template<typename T>
inline Quaternion<T>::Quaternion(const T fill[4])
: m_data{ fill[0], fill[1], fill[2], fill[3] }
{
}
}
Я не включил все реализации, потому что это много строк, если нужно больше, дайте мне знать в комментариях. Также я переадресовал объявленные специализации, которые я хочу экспортировать для обоих союзов, в файл. cpp.
Я не могу понять, в чем разница между вектором 4 и кватернионным объединением и почему Vector4 экспортируется, но Quaternion нет.
То, что я пробовал:
Я пытался удалить все методы специализации классов из файла .inl Quaternion, потому что это один из Несколько различий с объединением Vector4. В Quaternion есть некоторые члены специализации, подобные приведенным ниже:
template<>
inline void Quaternion<float>::normalize()
{
const float n = 1.0f / sqrt(axisX * axisX + axisY * axisY + axisZ * axisZ + degrees * degrees);
m_data[0] *= n;
m_data[1] *= n;
m_data[2] *= n;
m_data[3] *= n;
}
Это все равно приводит к ошибке.
Каким-то образом макрос CH_API продолжает расширяться до dllimport (есть также показано в подсветке синтаксиса), хотя это не относится к объединению Vector4.