在AIX上使用ofstream

8

我正在尝试在AIX Box上编写一个简单的C ++程序。

程序如下:

# 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本身是有效的...


这是否与gcc版本或gcc编译方式有关呢?我只是猜测。 - Ricketyship
3个回答

1
我遇到了同样的错误。重现错误的关键点如下: 1. 在共享库中使用std::stream(例如std::ofstream); 2. 在共享库中使用pthread函数(例如pthread_self); 3. 使用“-O2”来优化代码。 然后它显示“Segmentation fault (core dumped)”。
AIX提供了两个版本(64位)的libstdc++.a。(参见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/”
在我的机器上运行良好。

@TusharGupta 使用pthread选项有效。更改LIBPATH也有效。使用-lpthread更安全,因为它确保了包括可能被遗漏的其他链接。 - Ricketyship
注意:libstdc++的两个版本(带pthread和不带pthread)是不兼容的。通常情况下,你无法确定程序的其他部分是否会使用线程,因此安全起见,应始终使用带有pthread的版本。(类似的问题还有大文件支持(在32位模式下):不能混合使用不同编译器设置编译的代码。) - Lorinczy Zsigmond

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。这是因为我的LIBPATH在/usr之前具有此路径。
接下来,我将LIBPATH重置为排除所有使用pthread的gcc的路径,确保其他使用的gcc库在LIBPATH中可用。
最后,我使用这个新的LIBPATH编译了测试程序。
注意:LD_LIBRARY_PATH用于Linux,而LIBPATH用于AIX。
干杯!

@Christian.K :是的,我已经在你的答案下发表了评论 :) 如果你问我,两个答案都是正确的。你可以在CFLAGS中包含-pthread,或者让程序使用默认库而不是pthread库。 - Ricketyship

0

好久没碰了,但是我脑海中有印象:你不需要在编译/链接选项中添加-pthread吗?


我尝试使用LDFLAGS选项,但没有起作用。我仍然遇到了核心转储的相同问题。 - Ricketyship
我认为你需要在CCFLAGS和LDFLAGS中都加上它,但整个事情只是一个猜测而已 :-) - Christian.K
在两个地方使用“-pthread”选项就可以了 :) 非常感谢 :) - Ricketyship

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接