2012-01-19 30 views
8

Tôi đang cố viết một chương trình C++ đơn giản trên Hộp AIX. chương trình được đưa ra dưới đây:Sử dụng dòng trên AIX

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


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

LDFLAGS của tôi đã được thiết lập như sau:

-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 là: Chương trình

-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 

Các biên dịch tốt. Nhưng khi tôi cố gắng chạy như vậy, chương trình đi kèm với một lỗi phân đoạn. Tôi chạy cùng với gdb và tìm thấy vấn đề sau khi tôi sử dụng 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! 

Bất kỳ ý tưởng nào về lý do điều này xảy ra? Any help is appreciated :)

Lưu ý: fstream trong bản thân công trình ...

+0

Có phải làm điều gì đó với phiên bản gcc hoặc cách gcc được biên dịch không? Chỉ cần đoán thôi. – Ricketyship

Trả lời

0

Đã lâu rồi, nhưng trong đầu của tôi: bạn không cần phải thêm -pthread vào tùy chọn biên dịch/liên kết?

+0

Tôi đã thử sử dụng tùy chọn trong LDFLAGS. Không làm việc. Tôi vẫn còn có cùng một vấn đề cốt lõi dump. – Ricketyship

+0

Tôi nghĩ rằng bạn cần nó trong cả CCFLAGS và LDFLAGS, nhưng toàn bộ điều đó chỉ là một phỏng đoán :-) –

+0

Chắc chắn sẽ cố gắng và cập nhật kết quả sớm :) – Ricketyship

0

tôi đã phân tích vấn đề này và tìm thấy một công việc xung quanh.

Dưới đây là những gì tôi đã làm:

Tôi đã làm một ldd trên thực thi testprog tôi:

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) 

tôi thấy libstdc của pthread đó đã được sử dụng. Điều này là do LIBPATH tôi có con đường này trước/usr

Tiếp theo, tôi reset LIBPATH tôi để loại trừ tất cả những đường dẫn đó đã pthread của gcc được sử dụng, và đảm bảo rằng các thư viện gcc khác sử dụng nếu có trong LIBPATH

Cuối cùng tôi đã biên soạn chương trình thử nghiệm với LIBPATH mới này

Lưu ý: LD_LIBRARY_PATH được sử dụng bởi Linux và LIBPATH được AIX sử dụng.

Chúc mừng!

+0

Vì vậy, đã sử dụng tùy chọn '-pthread' sau đó không hoạt động sau khi tất cả? –

+0

@ Christian.K: vâng. Tôi đã nhận xét về câu trả lời của bạn :) Nếu bạn hỏi tôi, cả hai câu trả lời đều đúng. hoặc bạn bao gồm -pthread trong CFLAGS của bạn hoặc, làm cho chương trình sử dụng thư viện mặc định của bạn hơn thư viện pthread – Ricketyship

1

Tôi gặp lỗi tương tự. Các điểm chính để repro lỗi là: 1 sử dụng std :: stream (chẳng hạn như std :: ofstream) trong thư viện chia sẻ; 2 sử dụng chức năng pthread (như pthread_self) trong thư viện chia sẻ; 3 sử dụng "-O2" để tối ưu hóa mã. Sau đó, nó sẽ hiển thị "Lỗi phân đoạn (lõi bị đổ)".

AIX cung cấp 2 phiên bản (64bit) libstdC++. (Xem http://www.perzl.org/aix/index.php?n=Main.GCCBinariesVersionNeutral) 64-bit biên soạn, không thread-safe (<prefix>/ppc64) 64-bit biên soạn, thread-safe (<prefix>/pthread/ppc64)

giải pháp của tôi là: thay đổi LIBPATH để sử dụng phiên bản "<prefix>/pthread/ppc64". chẳng hạn như đặt LIBPATH là "/opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.6.1/pthread/ppc64/"

Nó hoạt động tốt trong máy của tôi.

+0

nó sẽ hoạt động ....? –

+0

@TusharGupta Sử dụng công cụ tùy chọn pthread. Thay đổi LIBPATH cũng hoạt động. Đó là an toàn hơn cho người dùng -lpthread vì điều này đảm bảo rằng bất kỳ liên kết khác mà có thể đã bị bỏ lỡ sẽ được bao gồm. – Ricketyship

+0

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

Các vấn đề liên quan