编译单个文件并与其他.o文件链接时,是否可以进行核心转储?

时间:2014-04-07 14:51:52

标签: c++ linker

我目前正在处理一个包含许多C ++文件的项目。所有C ++文件以前都运行良好。

我对一个名为a.cpp的文件进行了更改。

当我这样做时,我通常编译a.cpp并获得a.o,然后我链接所有.o文件以创建可执行文件。这通常有效。

但是,今天,我更改的文件中发生了核心转储。

重新编译后,一切正常。

是什么造成的?

注意:没有动态库调用。

1 个答案:

答案 0 :(得分:4)

如果在增量构建之后获得核心转储并且程序在完全构建之后工作,这通常意味着您的目标文件是针对不同版本的头文件编译的。

例如,假设a.cppb.cpp使用以下结构:

struct SampleStruct {
  char *SampleString;
};

现在假设结构已更改且仅重新编译a.cpp

struct SampleStruct {
  int SampleInt;
  char *SampleString;
};

每当a.o查看SampleStruct时,它都会期望偏移量为0的int和偏移量为4的char指针。每当b.o查看SampleStruct时,它将指向偏移量为0的char指针,如果a.ob.o一个SampleStruct,b.o将尝试将int视为char指针。随之而来的是混乱。

解决方案是使用可以获取标头依赖关系的正确构建系统。例如,如果您正在使用Make,则可以使用类似GenericMakefile之类的内容来为您创建Make和GCC跟踪标头依赖项。