如何编译相同的源代码生成不同的目标文件?

Jon*_*onS 5 c linux compiler-construction gcc arm

经过长时间的调试后,我将问题缩小到一个文件.问题是,当其他所有目录相同时,文件在两个不同的目录中编译的方式不同.

我正在使用CodeSourcery的arm gcc编译器(gcc版本4.3.3,Sourcery G ++ Lite 2009q1-161)来编译一个简单的文件.我在一个模块中使用它没有任何问题,然后我将其复制到另一个模块使用.编译时,目标文件明显不同.编译这两个文件的命令行是相同的(我使用linux历史记录确保),3个包含文件也是相同的副本(用diff检查).

我对两个目标文件进行了二进制比较,并且它们分散了很多单独的字节差异.我做了两个objdump -D并对它们进行了比较,并且存在很多差异.这是dump1,dump2diff.命令行是"arm-none-eabi-gcc --std = gnu99 -Wall -O3 -g3 -ggdb -Wextra -Wno-unused -c crc.c -o crc.o".

这怎么可能?我还用-S而不是-c编译并查看了汇编器输出,除目录路径外,它们是相同的.那么目标文件怎么会有所不同呢?

我真正的问题是,当我尝试将dump2的目标文件链接到我的程序时,我得到未定义的引用错误,因此对象中的某些内容是错误的,而dump1的对象没有得到这样的错误和链接.

Kir*_*lev 1

您的文件很可能会选择不同的包含文件。这是最有可能的原因。

检查您的包含路径是否与包含语句中的路径完全相同。它们可能指向不同的目录。C 和 C++ 有一个功能,当您#include abcd.h尝试abcd.h从调用文件的目录加载时。检查一下。