C++使用Eigen库传递Vector作为函数参数时出现未定义引用错误且类型被转换的问题求助
C++使用Eigen库传递Vector作为函数参数时出现未定义引用错误且类型被转换的问题求助
问题原因分析
首先要澄清一个关键误解:你看到的Matrix<double, 3, 1, 0, 3, 1>其实就是Eigen::Vector<double,3>,因为Eigen里的Vector<Scalar, N>本质上是Matrix<Scalar, N, 1>的typedef(别名),编译器只是把底层的真实类型打印出来了,并没有发生什么“类型转换”,这是完全正常的现象,不是导致错误的原因。
你遇到的undefined reference是链接阶段错误,不是编译阶段的类型不匹配问题。这个错误的核心原因是:编译器能找到Reperes::ned_to_lla的声明,但链接器找不到这个静态成员函数的实现代码。
常见的解决办法
根据你的代码结构,可能的问题和对应的修复方式如下:
静态成员函数的实现位置问题
- 如果你的
Reperes类声明在头文件(比如reperes.h),而ned_to_lla的实现放在单独的.cpp文件(比如reperes.cpp),要确保你编译时把reperes.cpp和你的main.cpp一起编译链接,不能只编译main.cpp。 - 举个g++编译的示例命令:
g++ main.cpp reperes.cpp -o your_program -I/path/to/eigen
- 如果你的
头文件中实现静态成员函数需要加
inline- 如果你把
ned_to_lla的实现直接写在头文件里(和类声明放在一起),必须给函数加上inline关键字,否则多个编译单元包含这个头文件时会出现重复定义,或者链接器找不到正确的实现:class Reperes { private: public: static Eigen::Vector<double, 3> ned_to_lla(const Eigen::Vector<double, 3>& ned); }; // 头文件中的静态成员函数实现必须加inline inline Eigen::Vector<double, 3> Reperes::ned_to_lla(const Eigen::Vector<double, 3>& ned) { Eigen::Vector<double, 3> lla = {0.0, 0.0, 0.0}; // ... 你的业务逻辑 return lla; }
- 如果你把
检查编译选项和链接配置
- 确保你正确包含了Eigen的头文件路径(编译时用
-I指定Eigen的安装目录),不过这个如果是问题的话,编译阶段就会报找不到头文件,你这里是链接错误,所以重点还是放在实现代码的链接上。
- 确保你正确包含了Eigen的头文件路径(编译时用
关于你尝试的EigenBase的问题
你提到尝试用EigenBase类型,但这完全没必要——你的参数类型是完全匹配的,问题根本不是参数类型不兼容,而是链接阶段找不到函数实现。所以不用去修改参数类型,先解决链接问题即可。
内容来源于stack exchange
相关产品推荐
相关产品推荐

