2012-01-19 8 views
8

私はAIX Boxに簡単なC++プログラムを書こうとしています。 プログラムは以下の通りである:私のLDFLAGSは以下のように設定されているAIX上でofstreamを使用する

# include <iostream> 
# include <fstream> 
using namespace std ; 


int main() 
{ 
    ofstream of ; 
    of.open("license.txt") ; 
    of<<"hello"<<endl ; 
    of.close() ; 
} 

-maix64 -L/disk3/TOOLS/GCCTools/gcc-4.5.1/lib/ppc64 \ 
-L/disk3/TOOLS/GCCTools/gcc-4.5.1/lib/gcc/powerpc-ibm-aix6.1.0.0/4.5.1/ppc64 \ 
-L/disk3/TOOLS/GCCTools/gcc-4.5.1/lib/gcc/powerpc-ibm-aix6.1.0.0/4.5.1 \ 
-L/disk3/TOOLS/OPENSSL/lib 

CFLAGSは次のとおりです。

-O2 -maix64 -I/disk3/TOOLS/OPENSSL/include -D_ALL_SOURCE -D_XOPEN_SOURCE \ 
-D_XOPEN_SOURCE_EXTENDED -DSS_64BIT_SERVER -D_POSIX_SOURCE -D__64BIT__ \ 
-I/disk3/TOOLS/OPENSSL/include -I/usr/include \ 
-I/disk3/TOOLS/GCCTools/gcc-4.5.1/lib/gcc/powerpc-ibm-aix6.1.0.0/4.5.1/include 

プログラムが正常にコンパイルされます。しかし、私が同じものを実行しようとすると、プログラムは、セグメント化の欠陥で出てくる。 は私はGDBと同じように走ったと私はofstreamの使用時に次の問題が見つかりました:

Program received signal SIGSEGV, Segmentation fault. 
0x09000000036107c4 in std::locale::operator=(std::locale const&) (this= 
findvar.c:706: internal-error: value_from_register: Value not stored anywhere! 

なぜこれが起こっている上の任意のアイデアを? すべてのヘルプは高く評価され:)

注:自身でfstreamの作品を...

+0

gccのバージョンやgccのコンパイル方法で何かをしなければなりませんか?ちょうど推測。 – Ricketyship

答えて

0

それはしばらくしているが、私の頭の外に:あなたは、コンパイル/リンクオプションに-pthreadを追加する必要はありませんか?

+0

LDFLAGSのオプションを使ってみました。うまくいきませんでした。私はまだコアダンプと同じ問題を抱えていました。 – Ricketyship

+0

私はCCFLAGSとLDFLAGSの両方でそれが必要だと思っていますが、とにかくちょっと推測しただけです。 –

+0

すぐに結果を更新してください:) – Ricketyship

0

を私は問題を分析し、周りの仕事を見つけました。ここで

は私がやったことです:

私はTESTPROGの実行可能ファイルにLDDをした:

ldd test 
test needs: 
     /usr/lib/threads/libc.a(shr_64.o) 
     /disk3/TOOLS/GCCTools/gcc-4.5.1/lib/gcc/powerpc-ibm-aix6.1.0.0/4.5.1/pthread/ppc64/libstdc++.a(libstdc++.so.6) 
     /disk3/TOOLS/GCCTools/gcc-4.5.1/lib/gcc/powerpc-ibm-aix6.1.0.0/4.5.1/pthread/ppc64/libgcc_s.a(shr.o) 
     /unix 
     /lib/libcrypt.a(shr_64.o) 
     /lib/libpthreads.a(shr_xpg5_64.o) 

私はpthreadのののlibstdcが使用されていたことがわかりました。これは、原因は/ usr

前にこのパスを持つ私のLIBPATH次に、私は必ずLIBPATH

で利用可能な場合に使用される他のgccのライブラリという作り、pthreadののGCCが使用されていたすべてのそれらのパスを除外するために、私のLIBPATHをリセットしました最後に、この新しいLIBPATHを使用してテストプログラムをコンパイルしました。

注:LD_LIBRARY_PATHはlinuxで使用され、LIBPATHはAIXで使用されます。

乾杯!

+0

だから、 '-pthread'オプションを使ってしまったのですが、結局は動作しませんでしたか? –

+0

@ Christian.K:はいそれでした。私はすでにあなたの答えにコメントしていた:)あなたが私に尋ねるなら、両方の答えが正しい。あなたのCFLAGSに-pthreadを含めるか、プログラムがpthreadライブラリよりもデフォルトのライブラリを使うようにしてください。 – Ricketyship

1

同じエラーが発生します。エラーを再現するためのキーポイントは次のとおりです。 1 share libaryのstd :: stream(std :: ofstreamなど)を使用します。 2共有ライブラリのpthread関数(pthread_selfなど)を使用します。 3 "-O2"を使用してコードを最適化します。 次に、「セグメンテーションフォルト(コアダンプされた)」と表示されます。

AIXには、2つのバージョン(64ビット)のlibstdC++が用意されています。スレッドセーフ(<prefix>/pthread/ppc64)

私のソリューションは、非スレッドセーフ(<prefix>/ppc64) 64ビットコンパイル、 64ビットコンパイル(http://www.perzl.org/aix/index.php?n=Main.GCCBinariesVersionNeutralを参照してください): 変更LIBPATHが"<prefix>/pthread/ppc64"バージョンを使用します。 な「/opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.6.1/pthread/ppc64/」

それは私のマシンではうまく機能として、設定されたLIBPATHなど。

+0

うまくいくでしょうか? –

+0

@TusharGupta pthreadオプションを使用すると動作します。 LIBPATHを変更することもできます。 -lpthreadを使用する方が安全です。これにより、欠落している可能性のあるリンクがすべて含まれるようになります。 – Ricketyship

+0

+1 :) .................. –

関連する問題