2

我正在使用仅标题的单文件“库”将.obj-models 从文件加载到图形程序中。弹出了一个简单的链接器错误:

LNK2005 “此处的信息”已在 main.obj 中定义

现在我知道这意味着什么,通常我会继续将实现移动到一个单独的文件中。然而,这是一个比我聪明的人提供的文件,所以依靠权威,我希望这件事能奏效。

它只抱怨向量乘法运算符重载和其他函数负载中的单个函数:

glm::vec3 operator*(const float& left, const glm::vec3& right){
    return glm::vec3(right.x * left, right.y * left, right.z * left);
}

bool inTriangle(glm::vec3 point, glm::vec3 tri1, glm::vec3 tri2, glm::vec3 tri3)
{
    // Starting vars
    glm::vec3 u = tri2 - tri1;
    glm::vec3 v = tri3 - tri1;
    glm::vec3 w = point - tri1;
    glm::vec3 n = glm::cross(u, v);

    float y = glm::dot(glm::cross(u, w), n) / glm::dot(n, n);
    float b = glm::dot(glm::cross(u, w), n) / glm::dot(n, n);
    float a = 1 - y - b;

    // Projected point
    glm::vec3  p = (a * tri1) + (b * tri2) + (y * tri3);

    if (a >= 0 && a <= 1
        && b >= 0 && b <= 1
        && y >= 0 && y <= 1)
    {
        return true;
    }
    else
        return false;
}

这些功能有什么特别之处吗?

该文件来自OBJ Loader,我对其进行了修改以使用glm我目前在其他地方使用的向量和实用程序。

4

1 回答 1

1

这些功能有什么特别之处吗?

是的,它们没有像命名空间inline中的所有其他自由函数一样被标记algorithm

在头文件中定义函数时,需要将其标记为内联,以便可以在多个翻译单元(包含在多个源文件中)中定义它而不会出错。

于 2018-03-28T19:30:58.897 回答