新しい Rogue Wave SL 2.0 をベースとした C++ 標準ライブラリ 2.0 |
 |
新しい -AA コマンド行オプションによって、新しい C++ 標準ライブラリ 2.0 を使用できます。このライブラリは新しい標準準拠の (「テンプレート化された」) iostream ライブラリが含まれている最初のリリースです。ISO
C++ 標準に準拠しています。
2.0 ライブラリは、HP C++ ランタイムに新しく追加され、旧バージョンの HP
aC++ でバンドルされていた C++ 標準ライブラリ 1.2.1 とは互換性がありません。HP
aC++ は、名称や保存場所を変更することなく、C++ 標準ライブラリ 1.2.1 を継続してサポートしています。-AA を使用しない場合は変更を気にする必要はありません。ただし、1.2.1 ライブラリは将来的には新しいライブラリに代わる予定です。
新しい 2.0 ライブラリを使用するときは、すべての変換単位をコンパイルしてリンクするために、-AA オプションを一貫して使用しなければなりません。実行プログラム内でのオブジェクトファイルの混在はサポートされていません。
このリリースに含まれている C++ 標準ライブラリ 2.0 (libstd_v2) は、同じライブラリの旧バージョンとは互換性がありません。-AA オプションと新しい 2.0 ライブラリを使用すると、aC++ 製品の旧バージョンで -AA を使用してコンパイルした他のアプリケーション/ ライブラリと互換性のないバイナリが作成されます。
新しい 2.0 ライブラリを使用するには、-AA オプションを使用して再コンパイルしなければなりません。また、ご使用のオペレーティングシステムに適したランタイムおよび/
またはヘッダーファイルパッチを適用する必要がある場合もあります (後述のリスト参照)。A.03.30 コンパイラを使用する場合は、ヘッダーファイルパッチをインストールする必要はありません。ヘッダーファイルパッチは、A.03.27、A.03.26、A.03.25、および A.01.27 の場合に必要です。
-AA オプションを指定しないで前述の 2.0 ライブラリを使用しなければバイナリの非互換性を避けることができます。-AA を使用しない場合でも、パッチをインストールする必要があります。コンパイラが A.03.30 で、-AA を使用する場合は、ヘッダーファイルパッチは A.03.30 に含まれていますが、ランタイムパッチをインストールしなければなりません。インストールしてから、-AA アプリケーションを再コンパイルして再リンクします。
HP 社では互換性のないバイナリを何も考えずに作成しているわけではありません。これは、オプションや派生する問題について十分考慮した結果です。ユーザーは新しい 2.0 ライブラリの使用を希望しています。また、2.0 ライブラリを使用することによって、11i
(11.11) 対応 HP-UX のマルチバイトサポート拡張機能との互換性を確保できます。A.03.25 バージョン (PHSS_21906) の場合は、mbstate_t のサイズとマングリングに誤りがありました。11i に対して定義されている値は 8 バイトで、libstd_v2 バージョンでは 4 バイトです。
特に次のテンプレートクラスは現在、サイズが大きくなっています。
std::fpos<std::mbstate_t>
これらのサイズの変更によって、メッセージを表示せずに破壊が行われる恐れがありますが、名前を変更することによってこの互換性の問題を検出しやすくするために、マングリングが変更されました。
std::mbstate_t は mbstate_t に変更されました。
std::tm は tm に変更されました。
したがって、ベータの A.03.25、Ecommerce コンパイラを持つ 11i または 11.0 上の A.03.26、AR1200 用の A.01.27、AR1200 用の A.03.27 で開発した場合は、次のヘッダーファイルとランタイムライブラリパッチを両方インストールしていない場合に、後述の問題があります。
 |
 |  |
 |
 | 注記: A.01.27 で開発したアプリケーションには、ベータ用を除いてランタイムパッチがないため、問題は発生していません。 |
 |
 |  |
 |
互換性の問題を引き起こす iostreams を使用する通常のプログラムには次のような unsats が発生します。
既存のアプリケーションが新しいランタイムパッチで実行される場合
/usr/lib/dld.sl: Unresolved symbol: do_out__Q2_3std14codecvt_bynameXTwTcTQ2_ 3std9mbstate_t_CFRQ2_3std9mbstate_tPCwT2RPCwPcT5RPc (plabel) from a.out_old /usr/lib/dld.sl: Unresolved symbol: do_in__Q2_3std14codecvt_bynameXTwTcTQ2_ 3std9mbstate_t_CFRQ2_3std9mbstate_tPCcT2RPCcPwT5RPw (plabel) from a.out_old |
新しいヘッダーなしで新しいランタイムとリンクしようとする場合
/usr/ccs/bin/ld: Unsatisfied symbols: std::codecvt_byname<wchar_t,char,std::mbstate_t>::do_in(std::mbstate_t &,const char *,const char *,const char *&,wchar_t *,wchar_t *,wchar_t *&) const (code) std::codecvt_byname<wchar_t,char,std::mbstate_t>::do_out(std::mbstate_t &,const wchar_t *,const wchar_t *,const wchar_t *&,char *,char *,char *&) const (code) |
古いランタイムで新しいヘッダーとリンクしたアプリケーションが実行される場合
/usr/lib/dld.sl: Unresolved symbol: do_out__Q2_3std14codecvt_ bynameXTwTcT9mbstate_t_CFR9mbstate_tPCwT2RPCwPcT5RPc (code) from a.out_new /usr/lib/dld.sl: Unresolved symbol: do_in__Q2_3std14codecvt_ bynameXTwTcT9mbstate_t_CFR9mbstate_tPCcT2RPCcPwT5RPw (code) from a.out_new |
古いランタイムと新しいヘッダーがリンクしようとする場合
/usr/ccs/bin/ld: Unsatisfied symbols: std::codecvt_byname<wchar_t,char,mbstate_t>::do_out(mbstate_t &,const wchar_t*,const wchar_t *,const wchar_t *&,char *,char *,char *&) const (code) std::codecvt_byname<wchar_t,char,mbstate_t>::do_in(mbstate_t &,const char *,const char *,const char *&,wchar_t *,wchar_t *,wchar_t *&) const (code) |
-mt によってスレッドをより簡単に使用する |
 |
新しい -mt オプションによって、-l や -D などのその他のフラグを設定しなくてもマルチスレッド機能が使用可能になります。HP
aC++ では、環境を調べて、自動的に適切なフラグを選択して設定します。オペレーティングシステムと使用する libstd によって 4 つのフラグセットがあります。
-mt のオプションマトリックスは、次のとおりです。
| OS 10.20 (user thread) | OS 11.x (kernel thread) ---------+--------------------------------+------------------------------- old-lib | -D_REENTRANT | -D_REENTRANT libstd | -DRW_MULTI_THREAD | -DRW_MULTI_THREAD 1.2.1 | -DRWSTD_MULTI_THREAD | -DRWSTD_MULTI_THREAD | -D_THREAD_SAFE | -D_THREAD_SAFE & | | -D_POSIX_C_SOURCE=199506L librwtool| | 7.0.x | -lcma | -lpthread ---------+--------------------------------+------------------------------ new-lib | -D_REENTRANT | -D_REENTRANT (-AA) | -D_RW_MULTI_THREAD | -D_RW_MULTI_THREAD | -D_RWSTD_MULTI_THREAD | -D_RWSTD_MULTI_THREAD libstd | | -D_POSIX_C_SOURCE=199506L 2.2.1 | | | -lcma | -lpthread ----------+--------------------------------+----------------------------------- |
マルチスレッドソースコードのコンパイルに使用するマクロは次のとおりです。
_REENTRANT
リエントラントな関数 (接尾辞 _r) を提供するシステムヘッダーファイルに必要です。
RW_MULTI_THREAD/_RW_MULTI_THREAD
Rogue Wave toolsh++ ヘッダーファイルおよびライブラリに必要です。RW_MULTI_THREAD は toolsh++ 7.0.x で使用します。_RW_MULTI_THREAD は toolsh++ 8.x で使用します (現在は使用不能)。
RWSTD_MULTI_THREAD/_RWSTD_MULTI_THREAD
Rogue Wave 標準ライブラリヘッダーファイルおよびライブラリに必要です。RWSTD_MULTI_THREAD は libstd 1.2.1 で使用します。_RWSTD_MULTI_THREAD は -AA を指定してコンパイルするときに、libstd 2.2.1 で使用します。
_POSIX_C_SOURCE=199506L
pthread に必要です。
-D__HPACC_THREAD_SAFE_RB_TREE の使用
Rogue Wave Standard C++ Library 1.2.1 (libstd) および Tools.h++ 7.0.6 (librwtool) は、基本実装の rb_tree クラスが関与していても、スレッドセーフではありません。つまり、/opt/aCC/include/ のツリーヘッダーファイル ( tree.cc など) が使用されていても、これらのライブラリはスレッドセーフではありません。多くの場合、C++ 標準ライブラリのコンテナークラスのマップまたは set ヘッダーをインクルードするか、tvset.h、tpmset.h、tvmset.h、tpmap.h などの RogueWave tools.h++ ヘッダーをインクルードすることによって、間接的に参照されます。
スレッドセーフにするために rb_tree 実装を変更することはバイナリの互換性を破壊することになるので、プリプロセスマクロ __HPACC_THREAD_SAFE_RB_TREE を定義しなければなりません。このマクロが定義されてもされなくても、ツリーヘッダーをインクルードするファイルをコンパイルするときは、その使用に一貫性がなければなりません。たとえば、定義済みのマクロによってコンパイルされた新しいオブジェクトファイルは定義済みのマクロなしでコンパイルされた古いオブジェクトファイルとリンクされてはいけません。定義済みのマクロによってビルドしたライブラリの提供者は、ツリーヘッダーがインクルードされるときに定義されたマクロでソースをコンパイルすることをユーザーに通知する必要があります。
このマクロは -mt によって設定されません。明示的にコマンド行で設定する必要があります。
_THREAD_SAFE
スレッドセーフ cfront 互換の libstream ヘッダーファイルとライブラリに必要です。頻繁に使用されるオブジェクト cout、cin、cerr、およびclog の場合は、<iostream.h> をインクルードするファイル用に -D_THREAD_SAFE コンパイル時フラグを指定できます。この場合は、オブジェクトの新しいインスタンスが、それを使用する各スレッド用に透過的に作成されます。すべてのインスタンスは同じファイル記述子を共有します。
libcma.*
10.20 システムで使用するユーザースレッドライブラリです。
libpthread.*
11.x システムで使用するカーネルスレッドライブラリです。