2011-12-23 10 views
11

Mam wspólną bibliotekę napisaną w C++. Eksportuje widoczny interfejs utworzony z funkcji extern "C", które tworzą, niszczą i manipulują nieprzejrzystymi typami.Biblioteka współdzielona C++ od C

Teraz chciałbym mieć czysty program C, który korzysta z tej biblioteki.

Czy mogę to zrobić (platforma samodzielnie)? Kiedy środowisko wykonawcze C++ i obiekty statyczne C++ zostaną zainicjowane, jeśli main nie jest napisane w C++?

Odpowiedz

5

Faza inicjalizacji zależy od platformy. W przypadku systemu Linux biblioteki ładowane dynamicznie mogą mieć specjalnie zadeklarowane symbole, które są automatycznie wywoływane przez dlopen() po załadowaniu biblioteki.

Zobacz stronę podręcznika dla dlopen(3), sekcja Przestarzałe symbole init() i fini(), aby uzyskać więcej informacji.

Inicjatory statyczne są domyślnie oznaczone jako __attribute__((constructor)), więc nie trzeba robić nic specjalnego, aby wywoływać je podczas ładowania biblioteki współdzielonej. Podejrzewam, że jest to to samo lub podobne na innych platformach.

+0

Dodatek. (glibc :) init/fini jest dostarczane przez środowisko uruchomieniowe (crtS.o) i jest używane do inicjalizacji statycznych obiektów czasu trwania i wywoływania funkcji oznaczonych __attribute __ ((constructor)), więc przesłonięcie init/fini na własną rękę może prowadzić do problemów , w tym ratowanie z powodu podwójnej definicji symbolu. –

+0

@ jørgensen: Czy to może być powód, dla którego są przestarzałe? – onitake

4

Czy mogę to zrobić (platforma samodzielnie)?

Ładowanie biblioteki jest operacją zależną od platformy.

Kiedy zostanie uruchomione środowisko wykonawcze C++ i obiekty statyczne C++ , jeśli główny nie jest napisany w C++?

Nie ma znaczenia. Zostaną zainicjowane przed wprowadzeniem głównej.

+1

Cóż, biblioteka może być nadal (ręcznie) ładowana po wprowadzeniu 'main'. I "' Zostaną one zainicjowane przed wprowadzeniem głównej. "" Jest błędnym przekonaniem. Jest zdefiniowany przez implementację, niezależnie od tego, czy inicjalizacja obiektu statycznego ma miejsce przed wprowadzeniem "main", czy kiedykolwiek przed jego pierwszym użyciem. Ale dla wszystkich celów praktycznych, tak, są one inicjowane przed 'głównym' lub zaraz po załadowaniu biblioteki. – jweyrich

1

Zwykle systemy z bibliotekami współdzielonymi mają własny punkt wejścia, w którym można to zrobić, a nie main, ale biblioteki DLL mają DLLMain, gdzie implementacja może umieścić taki kod. Jednak w ogólnym przypadku nie jest to żadna z twoich spraw i jest to zadanie jakiegokolwiek kompilatora, którego użyłeś do rozwiązania tego problemu.