I tried to build this C++ CMake project as DLL. Math.dll generated, but Math.lib did not generated.
This is source code.
Math.h
#pragma once
// Shared library import/export macro
#ifdef _WIN32
#ifdef MATH_EXPORTS
#define MATH_API __declspec(dllexport)
#define MATH_TEMPLATE
#else
#define MATH_API __declspec(dllimport)
#define MATH_TEMPLATE extern
#endif
#elif __linux__
#define MATH_API
#endif
#include <array>
#define VEC_BODY(T, N) \
public:\
MATH_API Vec<T, N>& operator=(const Vec<T, N>& v);\
MATH_API Vec<T, N> operator+(const Vec<T, N>& v) const;\
MATH_API Vec<T, N> operator-(const Vec<T, N>& v) const;\
MATH_API Vec<T, N> operator*(const Vec<T, N>& v) const;\
MATH_API Vec<T, N> operator*(float f) const;\
MATH_API T& operator[](size_t i) const;\
\
MATH_API double length(void) const;\
MATH_API double dot(const Vec<T, N>& v) const;\
public:\
std::array<T, N> data;\
\
friend MATH_API double dot(const Vec<T, N>& v0, const Vec<T, N>& v1);\
namespace Math
{
template<typename T, size_t N>
class Vec
{
VEC_BODY(T, N)
public:
MATH_API Vec();
MATH_API Vec(const std::array<T, N> values);
MATH_API virtual ~Vec(void);
};
template<>
class Vec<float, 4>
{
VEC_BODY(float, 4)
public:
float& x=data[0]; float& r=data[0];
float& y=data[1]; float& g=data[1];
float& z=data[2]; float& b=data[2];
float& w=data[3]; float& a=data[3];
};
template<typename T, size_t N>
MATH_API double dot(const Vec<T, N>& v0, const Vec<T, N>& v1);
template<typename T, size_t N>
inline Vec<T, N> operator*(float f, const Vec<T, N>& v) { return v * f; }
MATH_TEMPLATE template class Vec<float, 4>;
}
Math.cpp
#include <math.h>
#define MATH_EXPORTS
#include "Math.h"
namespace Math
{
template<typename T, size_t N>
MATH_API Vec<T, N>::Vec()
:data{}
{}
template<typename T, size_t N>
MATH_API Vec<T, N>::Vec(std::array<T, N> values)
:data(values)
{}
template<typename T, size_t N>
MATH_API Vec<T, N>::~Vec (void) {}
/* ... */
template<typename T, size_t N>
MATH_API double Vec<T, N>::dot(const Vec<T, N>& v) const
{
double ret = 0.0;
for (size_t i = 0; i < N; ++i)
{
ret += (double)data[i] * (double)v.data[i];
}
return ret;
}
template<typename T, size_t N>
MATH_API double dot(const Vec<T, N>& v0, const Vec<T, N>& v1)
{
return v0.dot(v1);
}
}
Explicit instantiation for Vec<float, 4> already exist at the end of Math.h, but it does not work. I've tried moving the definition of the method to the header file, but it doesn't fix the problem. Why did this happen, and how can I fix this?