2012-01-19 12 views
8

Sto provando a scrivere un semplice programma C++ su un AIX Box. Il programma è il seguente:Utilizzo ofstream su AIX

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


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

mio LDFLAGS ha è impostato come segue:

-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 

Il programma viene compilato bene. Ma quando provo a eseguire lo stesso, il programma esce con un errore di segmentazione. mi sono imbattuto lo stesso con gdb e trovato il seguente problema quando uso 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! 

Qualche idea su perché questo sta accadendo? Ogni aiuto è apprezzato :)

Nota: fstream in sé funziona ...

+0

Ha dovuto fare qualcosa con la versione di gcc o il modo in cui è stato compilato gcc? Tiravo a indovinare. – Ricketyship

risposta

0

È passato un po 'di tempo, ma fuori di testa: non è necessario aggiungere -pthread alle opzioni di compilazione/collegamento?

+0

Ho provato a usare l'opzione nel LDFLAGS. Non ha funzionato Stavo ancora avendo lo stesso problema di core dump. – Ricketyship

+0

Penso che ne hai bisogno sia in CCFLAGS che in LDFLAGS, ma l'intera faccenda è stata solo un'ipotesi :-) –

+0

Cercherò sicuramente di aggiornare il risultato a breve :) – Ricketyship

0

ho analizzato il problema e trovato intorno a un lavoro.

Ecco quello che ho fatto:

ho fatto un LDD sul mio eseguibile TestProg:

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) 

ho scoperto che libstdc di pthread è stato utilizzato. Ciò era dovuto alla mia LIBPATH avere questo percorso prima di/usr

Avanti, ripristina il LIBPATH per escludere tutti quei percorsi che gcc avuto pthread in uso, facendo in modo che le altre librerie GCC usati, se disponibili in LIBPATH

Infine ho compilato il programma di test con questo nuovo LIBPATH

Nota: LD_LIBRARY_PATH è utilizzato da linux e LIBPATH è utilizzato da AIX.

Cheers!

+0

Quindi, l'uso dell'opzione '-pthread' non funzionava dopotutto? –

+0

@ Christian.K: sì. Ho già commentato la tua risposta :) Se mi chiedi, entrambe le risposte sono giuste. o includi -pthread nei tuoi CFLAG o, fai in modo che il programma usi le tue librerie predefinite rispetto alle librerie pthread – Ricketyship

1

Ho riscontrato lo stesso errore. I punti chiave per riprodurre l'errore sono: 1 utilizzare std :: stream (come std :: ofstream) nella libreria di condivisione; 2 utilizzare la funzione pthread (come pthread_self) nella libreria condivisa; 3 utilizzare "-O2" per ottimizzare il codice. Quindi mostra "Errore di segmentazione (core dumped)".

AIX fornisce 2 versioni (64 bit) di libstdC++. A. (Vedi http://www.perzl.org/aix/index.php?n=Main.GCCBinariesVersionNeutral) a 64 bit di compilazione, non thread-safe (<prefix>/ppc64) a 64 bit di compilazione, thread-safe (<prefix>/pthread/ppc64)

La mia soluzione è: cambiamento LIBPATH utilizzare "<prefix>/pthread/ppc64" versione. come set LIBPATH come "/opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.6.1/pthread/ppc64/"

Funziona bene nella mia macchina.

+0

funzionerà ....? –

+0

@TusharGupta L'utilizzo dell'opzione pthread funziona. Anche il cambio di LIBPATH funziona. È più sicuro per utente -lpthread in quanto garantisce che tutti gli altri link che potrebbero essere stati persi saranno inclusi. – Ricketyship

+0

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