我正在尝试构建一个小程序,我有自己的库libfoo。我有一个从我的Vector3类调用静态函数的相机类(即crossProduct)。我的相机类和Vector3类编译好,并内置到libfoo中。但是当我像这样链接时:
g++ -g -O2 -o test1 main.o -lfoo
我明白了:
libfoo.so: undefined reference to
foo::Vector3::dotProduct(foo::Vector3 const&, foo::Vector3 const&)
现在Vector3.h中的函数是:
static Vector3 crossProduct(const Vector3 &v1, const Vector3 &v2);
并且在...内
类定义......它在Vector3.cpp中定义。
程序很好,直到我在Camera.cpp中调用这个静态函数。为了解决这个问题,我必须将Vector3.cpp中的代码从头文件中的代码更改为:
Vector3 Vector3::crossProduct(const Vector3 &v1, const Vector3 &v2)
它编译,链接并运行正常。
Vector3类是由其他人为Windows编译器编写的,但我已将其移至Linux。这是一个g ++的东西吗?还是坏代码?
TIA。
答案 0 :(得分:1)
听起来你的vector3.cpp文件最初有以下内容:
Vector3 crossProduct(const Vector3 &v1, const Vector3 &v2)
{
...
}
你必须改为:
Vector3 Vector3::crossProduct(const Vector3 &v1, const Vector3 &v2)
{
...
}
前者只是定义了一个名为crossProduct的独立函数,而后者定义了一个名为crossProduct的Vector3成员函数。后者是正确的,我猜测原始代码是错误的。