图书馆中函数的未定义参考

时间:2014-07-12 02:24:16

标签: c++ gcc c++11 compiler-errors codeblocks

我在我自己的数学库上工作,我在用于库的命名空间中有几个非成员函数(" cml",就像它重要一样许多)。无论如何,库(我将静态构建为.a / .lib文件)编译得很好,但是当我在测试程序中使用库时,我得到一个错误,即函数是未定义的引用。

这是标题(func.h)文件:

namespace cml
{

template <typename T>
T toRadians(T val);
template <typename T>
T toDegrees(T val);

template <typename T>
T fastSqrt(T val);
template <typename T>
T fastInverseSqrt(T val);

}

这是func.cpp文件:

#include <CML/func.h>

#include <cmath>
#include <math.h>
#include <limits>
#include <cassert>

namespace cml
{

template <typename T>
T toRadians(T val)
{
    static_assert(std::numeric_limits<T>::is_iec559, "toRadians() requires the template parameters to be floating points.");

    return val * MATH_PI / 180;
}

template <typename T>
T toDegrees(T val)
{
    static_assert(std::numeric_limits<T>::is_iec559, "toDegrees() requires the template parameters to be floating points.");

    return val * 180 / MATH_PI;
}

template <typename T>
T fastSqrt(T val)
{
    static_assert(std::numeric_limits<T>::is_iec559, "fastSqrt() requires the template parameters to be floating points.");

    return T(1) / fastInverseSqrt(val);
}

template <typename T>
T fastInverseSqrt(T val)
{
    static_assert(std::numeric_limits<T>::is_iec559, "fastInverseSqrt() requires the template parameters to be floating points.");

    T tmp = val;
    T half = val * T(0.5);
    uint32* p = reinterpret_cast<uint32*>(const_cast<T*>(&val));
    uint32 i = 0x5f3759df - (*p >> 1);
    T* ptmp = reinterpret_cast<T*>(&i);
    tmp = *ptmp;
    tmp = tmp * (T(1.5) - half * tmp * tmp);
#if defined(CML_ACCURATE_FUNC) // If more accuracy is requested, run Newton's Method one more time
    tmp = tmp * (T(1.5) - half * tmp * tmp);
#endif // defined
    return tmp;
}

}

我收到了所有四个函数的错误。我在Windows8上使用最新版本的Code :: Blocks和GCC。我正在为Win32编译。我已经尝试了不同的建议,我发现它们可以标记功能extern,但它似乎无法修复它。我确信它很简单,我很遗憾,如果是这样的话,第二双眼睛可能有所帮助。

错误:undefined reference to float cml :: toRadians(float)&#39;`

1 个答案:

答案 0 :(得分:2)

您需要在头文件中定义模板函数。我会做的是

  1. 将func.cpp重命名为func.inl,并确保它没有使用C ++编译器进行编译。
  2. 将行#include "func.inl"添加到func.h的底部。
  3. 模板函数不像常规函数那样编译,而是由稍后的编译阶段(如内联函数)处理。