我遇到了一个奇怪的问题。
(1)我首先通过gcc(版本2.96-110)将模块构建到静态库xxx.a。 xxx.a中的一些代码就像:
const char * const str = “hello world”
void fun()
{
printf(“%s”, str);
return;
}
(2)然后我通过gcc(版本2.96-98)将xxx.a链接到我的程序EXE。在EXE中,调用API fun()。
(3)当我运行EXE时,输出是“llo world”,而不是“hello world”。太奇怪了。
是由gcc版本的差异引起的吗?
答案 0 :(得分:2)
请注意there was never any official GCC 2.96 release:
我们注意到一些GNU / Linux发行版目前正在发布“GCC 2.96”。
我们想指出GCC 2.96不是正式的GCC版本,也不会有这样的版本。相反,GCC 2.96一直是我们开发分支的代号,最终将成为GCC 3.0。
GCC 3.0是一项重大工作,涉及GCC 2.95的ABI变更。由于“GCC 2.96”基于GCC 3.0开发的快照,因此ABI可能在不断变化,并且您正在遭受使用开发快照作为生产编译器的副作用。
答案 1 :(得分:1)
一直以来你不能使用旧的G ++链接而不是用来编译任何对象或库,所以你所做的不太可能适用于任何两个GCC版本,特别是不是非官方的,不稳定的2.96系列。
2013年加入我们,至少使用GCC 4.4
答案 2 :(得分:0)
看起来像堆栈损坏,可能是由非官方的GCC版本引起的。如果你有源代码,为什么不使用最新的GCC编译库?