2

奇妙な問題に遭遇しました。

(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 を実行すると、「hello world」ではなく「llo world」が出力されます。とても奇妙です。

gccのバージョンの違いが原因ですか?

4

3 に答える 3

2

公式の GCC 2.96 リリースは一度もなかったことに注意してください。

一部の 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 はおそらく流動的であり、開発スナップショットを製品コンパイラとして使用する副作用に苦しんでいます。

于 2013-08-22T08:41:20.260 に答える
1

オブジェクトやライブラリをコンパイルするために使用したものよりも古い G++ を使用してリンクすることはできません。したがって、あなたが行っていることは、2 つの GCC バージョン、特に非公式で不安定な 2.96 シリーズでは機能しない可能性があります。

2013 年に参加して、少なくとも GCC 4.4 を使用してください

于 2013-08-22T08:47:03.340 に答える
0

スタックの破損のようです。非公式の GCC バージョンが原因である可能性があります。ソース コードがある場合は、最新の GCC を使用してライブラリをコンパイルしてみませんか?

于 2013-08-22T09:03:49.940 に答える