Bus error: 10

   最近写一个小程序,设计的类比较多,为了编译方便专门为源码和测试代码编写了Makefile。

   调试过程中,突然出现“Bus error: 10”的错误,让人措不及防,为什么会出现这种奇观的问题呢?

   网上查了很多几个帖子,基本一致认为是地址对齐的问题,大意为:int型数据的起始地址必须为4的倍数,否则会引起上述提到的总线错误。本着这个思想,查找了半天也没找到地址不对齐的地方。

  再次编译时,从编译过程发现了一些猫腻。Makefile编译时,会将源文件“.c/.cpp”编译为“.o”文件(二进制文件),然后再将这些“.o”文件链接为目标文件(可执行程序或者库等)。若对其中某些文件进行修改,则Makefile会通过检测时间戳的方式,只编译后面修改的文件,以此来减少编译时间。那么问题来了,若修改了头文件会怎么样?例子如下:

         假设将要修改classA.h classA.cpp两个文件,头文件中为其添加成员变量,并在源文件做处理。

         而classB.cpp classC.cpp两个文件则会include  classA.h文件,由于include的包含型,所以实际上头文件中的代码已经写入到了源文件中,并将其编译为“.o”文件。

         当修改完成后,classB.cpp classC.cpp并未发生变化,因此对比时间戳时,判定classB.cpp classC.cpp不需要再次编译。但此时classB.cpp classC.cpp文件所以依赖的头文件classA.h确确实实已经变了,那么当进行数据访问时,其成员的地址偏移也大变样,编译时无法发现错误,但执行时则会爆炸。。。。

  解决办法:综上不难发现问题的所在,前后代码持有的头文件错落,导致发生运行的错误,只需将依赖的被修改的头文件的类再次编译即可,简单办法,将当前项目clean之后,再编译即可。

  写此博客仅用来记录曾经犯下的幼稚问题:若头文件发生了变化,一定要全部重新编译,否则等死吧。。。

  以上!

那么问题来了,Makefile可否添加源文件对头文件的依赖关系呢?检测依赖头文件和“.o”文件的时间戳,并对其进行编译。先记录一下,以后有机会再研究吧。

猜你喜欢

转载自blog.csdn.net/xy_kok/article/details/87931586