我目前正在处理一个包含许多C ++文件的项目。所有C ++文件以前都运行良好。
我对一个名为a.cpp
的文件进行了更改。
当我这样做时,我通常编译a.cpp
并获得a.o
,然后我链接所有.o
文件以创建可执行文件。这通常有效。
但是,今天,我更改的文件中发生了核心转储。
重新编译后,一切正常。
是什么造成的?
注意:没有动态库调用。
答案 0 :(得分:4)
如果在增量构建之后获得核心转储并且程序在完全构建之后工作,这通常意味着您的目标文件是针对不同版本的头文件编译的。
例如,假设a.cpp
和b.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.o
给b.o
一个SampleStruct,b.o
将尝试将int视为char指针。随之而来的是混乱。
解决方案是使用可以获取标头依赖关系的正确构建系统。例如,如果您正在使用Make,则可以使用类似GenericMakefile之类的内容来为您创建Make和GCC跟踪标头依赖项。