2012-01-19 38 views
8

我正試圖在AIX上編寫一個簡單的C++程序。 該方案如下:在AIX上使用ofstream

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


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

我LDFLAGS已被設置如下:

-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) 

我發現了正在使用的並行線程的的libstdc。這是由於有之前的/ usr

接下來這條道路我LIBPATH,重置我LIBPATH排除所有那些已並行線程的GCC正在使用的路徑,確保用在提供LIBPATH

其它GCC庫最後我用這個新的LIBPATH編譯測試程序

注:LD_LIBRARY_PATH由linux使用,LIBPATH由AIX使用。

乾杯!

+0

那麼,是否使用'-pthread'選項,然後不工作? –

+0

@ Christian.K:是的確如此。我已經評論過你的答案:)如果你問我,兩個答案都是對的。要麼在你的CFLAGS中包含-pthread,要麼使程序使用你的默認庫而不是pthread庫 – Ricketyship

1

我遇到了同樣的錯誤。重現錯誤的關鍵點是: 1在共享庫中使用std :: stream(如std :: ofstream); 2在共享庫中使用pthread函數(如pthread_self); 3使用「-O2」優化代碼。 然後顯示「Segmentation fault(core dumped)」。

AIX提供2個版本(64位)的libstdC++。 (見http://www.perzl.org/aix/index.php?n=Main.GCCBinariesVersionNeutral) 64位編譯,非線程安全的(<prefix>/ppc64) 64位編譯,線程安全(<prefix>/pthread/ppc64)

我的解決辦法是: 變化LIBPATH使用"<prefix>/pthread/ppc64"版本。 如將LIBPATH設置爲「/opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.6.1/pthread/ppc64/」

它在我的機器上運行良好。

+0

它會工作....? –

+0

@TusharGupta使用pthread選項的作品。更改LIBPATH也可以。用戶-lpthread更安全,因爲這可以確保可能會遺漏的任何其他鏈接都將包含在內。 – Ricketyship

+0

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