代码之家  ›  专栏  ›  技术社区  ›  Felix

将仅标头库包含到多个文件中会产生链接器错误

  •  3
  • Felix  · 技术社区  · 6 年前

    我正在使用一个只有头的单一文件“库”来加载 .obj -将模型从文件导入图形程序。出现了一个简单的链接器错误:

    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 我目前在其他地方使用的向量和实用程序。

    1 回复  |  直到 6 年前
        1
  •  2
  •   NathanOliver    6 年前

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

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

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