将 header-only 库包含到多个文件中会产生链接器错误
Inclusion of a header-only library to multiple files producing a linker error
我正在使用 header-only single-file "library" 将文件中的 .obj
模型加载到图形程序中。弹出一个简单的链接器错误:
LNK2005 "Info here" already defined in 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
向量和实用程序。
Is there something special about these functions?
是的,它们不像 algorithm
命名空间中的所有其他免费函数那样被标记为 inline
。
当您在头文件中定义一个函数时,您需要将其标记为内联,以便它可以在多个翻译单元(包含在多个源文件中)中定义而不会出错。
我正在使用 header-only single-file "library" 将文件中的 .obj
模型加载到图形程序中。弹出一个简单的链接器错误:
LNK2005 "Info here" already defined in 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
向量和实用程序。
Is there something special about these functions?
是的,它们不像 algorithm
命名空间中的所有其他免费函数那样被标记为 inline
。
当您在头文件中定义一个函数时,您需要将其标记为内联,以便它可以在多个翻译单元(包含在多个源文件中)中定义而不会出错。