Sun CC(主に6.2ですが、12.1でも発生するようです)に問題があり、共有オブジェクトのfstreamテンプレートにコンパイルまたはリンクできないようです。
私が作業しているレガシーシステムからこれを引き出し、この例で再現しました。
C / C ++共有オブジェクト(main.c):
extern "C" {
int xmain()
{
fstream logstr("/tmp/log.txt", ios_base::out | ios_base::app);
if(logstr.is_open())
{
logstr<<"Helloworld"<<endl;
logstr.close();
}
printf("Hello world\n");
return 0;
}
}
そしてCメインプログラム(main2.c):
int main()
{
void *fd;
xman *xx;
printf("Loading library\n");
fd = dlopen("libmain.so", RTLD_GLOBAL | RTLD_NOW);
if(fd==NULL)
{
printf("Failed to open %s\n",dlerror());
return -1;
}
printf("library loaded\n");
xx = (xman *)dlsym(fd, "xmain");
(*xx)();
return 0;
}
ライブラリをコンパイルする
CC -g -o main.o -c main.C
CC -g -G -o libmain.so main.o -lCrun
Cメインプログラムをコンパイルします
cc -g -o main2.o -c main2.c
cc -g -o main2 main2.o -ldl
これを実行すると、SunOS5.8で次のエラーが発生します。
./main2 | c++filt
Loading library
Failed to open ld.so.1: main2: fatal: relocation error: file ./libmain.so: symbol std::basic_fstream<char,std::char_traits<char> >::~basic_fstream(): referenced symbol not found
これはnmによって確認されます:
nm libmain.so | c++filt | grep stream
[55] | 0| 0|FUNC |GLOB |0 |UNDEF |std::basic_fstream<char,std::char_traits<char> >::~basic_fstream()
[65] | 0| 0|FUNC |GLOB |0 |UNDEF |std::basic_fstream<char,std::char_traits<char> >::basic_fstream(const char*,int,long)
[64] | 0| 0|FUNC |GLOB |0 |UNDEF |void std::basic_fstream<char,std::char_traits<char> >::close()
[53] | 0| 0|FUNC |GLOB |0 |UNDEF |bool std::basic_fstream<char,std::char_traits<char> >::is_open()
私が使用しているコンパイラのバージョン:
CC -V
CC: Sun WorkShop 6 update 2 C++ 5.3 Patch 111685-11 2002/10/31
Sun CCにfstreamをライブラリにコンパイルするように説得する必要がありますか?または、リンクできるライブラリはありますか?stlport4(http://developers.sun.com/solaris/articles/cmp_stlport_libCstd.html)を使用するように変更することはできません。これは、Sun CC 6.2(または5.3 ...バージョン番号とは何ですか?)では使用できないためです。
Linuxでコンパイルし、libstdc ++に対してリンクする場合、これは正常に機能するようです。fstreamがlibstdc++にコンパイルされていると思いますか?(nmはこれを確認しているようです)。