2014-04-07 25 views
1

我目前正在处理一个包含许多C++文件的项目。所有C++文件以前工作正常。编译单个文件并与其他.o文件链接时是否可以进行核心转储?

我做了更改名为a.cpp一个文件。

当我这样做时,我通常会编译a.cpp并得到a.o,然后我链接所有的.o文件来创建可执行文件。这通常起作用。

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

重新编译一切后,它工作正常。

这是什么造成的?

注意:没有动态库调用。

+0

你的编译器是什么?你传递给它什么命令行参数?通过'exe'标签,我假设你在Windows上,但是哪个版本? –

回答

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时,它都会期望char指针处于off et 0,所以如果a.o给出b.o SampleStruct,b.o将尝试将int作为char指针处理。混沌随之而来。

解决方案是使用一个合适的构建系统,可以选择标题依赖关系。例如,如果您正在使用Make,则可以使用类似GenericMakefile的东西来为您创建Make和GCC跟踪标题依赖关系。

相关问题