Sun CC не связывается или не компилируется в шаблоне fstream в Shared Object - PullRequest
1 голос
/ 10 ноября 2011

У меня проблема с Sun CC (в основном 6.2, но, похоже, также и с 12.1), из-за которой я не могу скомпилировать или связать шаблон fstream в Shared Object.

Я извлек это из устаревшей системы, над которой я работаю, и воспроизвел ее здесь, в этом примере.

Общий объект 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

Запуск этой программы приводит к следующей ошибке в SunOS 5.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 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 ++? (кажется, что это подтверждает Н.М.)

...