错误程序(示例)如下:
//myclass.h
class MyClass {
public:
static int m_staticVar;
int m_var;
void SetMember(int value);
};
int MyClass::m_staticVar = 0;
//myclass.cpp
#include "myclass.h"
void MyClass::SetMember(int value)
{
this->m_var=value;
}
//myclass_main.cpp
#include "myclass.h"
int main()
{
return 0;
}
# 编译
g++ -o myclass_main myclass.cpp myclass_main.cpp
此程序的错误在于,myclass.h
定义了一个静态成员变量m_staticVar
,并在文件末尾进行了初始化。这种写法可能会导致链接问题,因为静态成员变量的初始化应该放在源文件myclass.cpp
中。
按道理说,这个错误应当在编译时报错。然而不知道为什么,编译通过了。这是shit山项目代码的一部分,整个项目能正常运行,只是在每次ctrl+c结束运行时,弹出一个“段错误”。这个段错误并不影响功能,但看着实在难受。于是我排查了好久找到了问题所在,并记录下来以备不时之需。
未经验证的成因猜测:1.与ROS多线程有关?2.工作空间中有之前成功编译的记录,catkin_make识别到这部分代码“曾经编译通过且代码内容无变化“所以基于节省资源加速编译的逻辑跳过了这部分编译?但a.如果之前代码也这样,为什么之前可以通过?是编译器版本差异?b.如果之前代码不是这样,为什么识别不到改动?为什么没有重新编译?c.我记得尝试过删除build和devel目录,再执行catkin_make,仍然没有报错,这就推翻了这个猜测的前提条件。
无法复现,不再深究。