torutkのブログ

ソフトウェア・エンジニアのブログ

SunStudio C++標準ライブラリ

TAOのビルドオプション設定を解析していると、コンパイラバージョンを判定してSTLportを使用するオプションを設定している記述がありました。

調べてみると、SunStudio C++コンパイラは2つのC++標準クラスライブラリを提供しています。

  1. libCstd
  2. libstlport4

デフォルトでは1.が使用されますが、これはC++標準規格への適合性が劣っているため、よりC++標準規格への適合性が高いSTLportのライブラリに切り換えることができます。その際コンパイルオプションとして-library=stlport4を指定します。

TAOやBoostでは、Sunの純正C++標準ライブラリは壊れているのでSTLportを使うようにしています。

SunStudio11でTAOをビルドする際にSTLportを使用する

ACE-5.5/TAO-1.5に添付されているSunStudio C++コンパイラ用のMakefile共通設定において、STLportの利用を設定している箇所を抜粋します。

  • platform_sunos5_sunc++.GNUの中の記述
ifeq (C++ 5.6,$(findstring C++ 5.6,$(CC_VERSION))
  PLATFORM_STLPORT_CPPFLAGS = -library=stlport4
else
  ifeq (C++ 5.7,$(findstring C++ 5.7,$(CC_VERSION))
    PLATFORM_STLPORT_CPPFLAGS = -library=stlport4
  endif
endif
  • wrapper_macros.GNUの中の記述
stlport ?= 0
ifeq ($(stlport),1)
  CPPFLAGS += -DACE_HAS_STLPORT $(PLATFORM_STLPORT_CPPFLAGS)
  LDFLAGS += $(PLATFORM_STLPORT_LDFLAGS)
  LIBS += $(PLATFORM_STLPORT_LIBS)
endif

SunのC++コンパイラのバージョンは、5.6がSunSudio9、5.7がSunStudio10に含まれるものです。SunStudio11に含まれるC++コンパイラのバージョンは5.8です。したがって、上記設定ではSunStudio11ではstlport=1を指定しても、STLportライブラリが使用されないことになります。
そこで、回避策としてplatform_macros.GNUに以下の記述を追加します。

PLATFORM_STLPORT_CPPFLAGS = -library=stlport4