我目前正在处理一个包含许多C++文件的项目。所有C++文件以前工作正常。编译单个文件并与其他.o文件链接时是否可以进行核心转储?
我做了更改名为a.cpp
一个文件。
当我这样做时,我通常会编译a.cpp
并得到a.o
,然后我链接所有的.o
文件来创建可执行文件。这通常起作用。
然而,今天,我更改的文件中发生了核心转储。
重新编译一切后,它工作正常。
这是什么造成的?
注意:没有动态库调用。
我目前正在处理一个包含许多C++文件的项目。所有C++文件以前工作正常。编译单个文件并与其他.o文件链接时是否可以进行核心转储?
我做了更改名为a.cpp
一个文件。
当我这样做时,我通常会编译a.cpp
并得到a.o
,然后我链接所有的.o
文件来创建可执行文件。这通常起作用。
然而,今天,我更改的文件中发生了核心转储。
重新编译一切后,它工作正常。
这是什么造成的?
注意:没有动态库调用。
如果在增量构建之后获得核心转储并且程序在完整构建后工作,这通常意味着您的对象文件是针对不同版本的头文件编译的。
例如,假设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时,它都会期望char指针处于off et 0,所以如果a.o
给出b.o
SampleStruct,b.o
将尝试将int作为char指针处理。混沌随之而来。
解决方案是使用一个合适的构建系统,可以选择标题依赖关系。例如,如果您正在使用Make,则可以使用类似GenericMakefile的东西来为您创建Make和GCC跟踪标题依赖关系。
你的编译器是什么?你传递给它什么命令行参数?通过'exe'标签,我假设你在Windows上,但是哪个版本? –