一般出现undefined reference to的原因常见的有以下几种可能,按照出现频率排列:
1. 如果是你自己写的包/或者直接copy的别人的包中出现的这种错误,一般是定义与实现不匹配,或者是你用错了导致的,例如:
定义为:bool compute(const Eigen::Vector4d& pose, const double& var);
但是你实现的时候写成了这样:
bool compute(const Eigen::Vector3d& pose, const int& var) {
xxx;
}
或者你用错了:
Eigen::Vector4d pos_;
duoble a_;
double b_;
compute(pos_, a_, b_);
遇到这种情况,直接去源文件中相应修改即可。
2. 如果是系统库中的东西出现了undefined reference to错误,这时候第一个应该想到的是,是不是没有在CMakeLists.txt和package.xml文件没有配置好,例如:
我遇到的错误是“undefined reference to `google::base::CheckOpMessageBuilder::CheckOpMessageBuilder(char const*)'”,提示是glog中的一些东西未定义,这个时候我在CMakeLists.txt中加入了:
set(GLOG_LIB glog)
target_link_libraries(${PROJECT_NAME} PUBLIC ${GLOG_LIB})
并在package.xml给出编译依赖:
<build_depend>libgoogle-glog-dev</build_depend>
<exec_depend>libgoogle-glog-dev</exec_depend>
通过上述方法就可以解决一些关于系统库的undefined问题。
3. 如果第二步还不能解决系统库的undefined错误,那么就需要考虑是不是系统中安装的库版本和你在项目中用到的版本不一致的问题导致。如果是的话,则需要把对应的系统库升级/降级,但是升级或降级系统库前要慎重,因为其他的应用或者项目可能依赖当前版本的库,如果不适合升级/降级现有库,则可能需要你通过源码下载该库的所需版本,并把它安装到你项目目录下,然后对应改变CMakeLists.txt和package.xml来链接新安装的库来解决。