🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.objects
Article #5028

Inicjalizacja obiektów globalnych w bibliotekach dynamicznych

#5028
From: Piotr Piatkowski
Date: Thu, 04 Mar 1999 10:31
42 lines
2655 bytes
Witam, dawno mnie tu nie było, więc przepraszam że tak wskakuję "z ulicy"
i od razu z pytaniem, ale sprawdziłem w FAQ i nic na ten temat nie ma.

Na początek środowisko - Linux Redhat 5.1, kompilator:
gcc version egcs-2.90.27 980315 (egcs-1.0.2 release)
glibc-2.0.7-13

Mam następujący problem - jest duża biblioteka do projektu z różnymi
podstawowymi klasami (interfejs do SQL, zestaw widgetów), aby przyspieszyć
kompilację (a właściwie linkowanie) jest ona w trakcie "produkcji"
linkowana jako *.so i tak dolinkowywana do reszty projektu.

Niestety, już na samym początku prac pojawił się problem - program 
linkowany statycznie działa poprawnie, linkowany z biblioteką dynamiczną
core'uje się. Szczęśliwie dość szybko udało mi się dojść przyczyny.
Otóż, niektóre klasy mają zmienne statyczne, deklarowane w jednym z 
plików *.cpp w ten sposób:

QString HTTimestamp::long_format( "%A, %d %B %Y, %H:%M" );

QString to obiekt z biblioteki qt, jak łatwo domyślić się jest to
po prostu string. 

Po debugowaniu doszedłem do tego, że jeżeli taki kod znajduje się
w bibliotece dynamicznej, to nie wykonywana jest jego inicjalizacja.
Efekt jest taki jakby został wykonany konstruktor bezparametrowy,
przez co później obiekt long_format zwraca w pewnym miejscu NULL
i program się sypie.

I teraz pytanie - czy taki sposób inicjalizacji zmiennych statycznych
(czyli w praktyce globanych) jest poprawny, czy zachowanie kompilatora
jest prawidłowe i czy ktoś może ma pomysł jak obejść ten problem, tzn.
jak zainicjować takie zmienne żeby działało to także przy kompilacji
do biblioteki statycznej.

Przypominam, że przy linkowaniu statycznym wszystko działa poprawnie.
Z tego co mi mówił znajomy, jeżeli zastosować w takim przypadku 
zmienną typu wbudowanego (np. char *) to inicjalizacja działa poprawnie
także w wypadku umieszczenia kodu w *.so.

-- 
Piotr Piątkowski, Kraków
Technical Details
Message-ID: <7blnec$qo8$1@druid.ceti.com.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!agh.edu.pl!news.wnaft.agh.edu.pl!news.memax.krakow.pl!news.astercity.net!news.icm.edu.pl!news.ceti.com.pl!not-for-mail

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!agh.edu.pl!news.wnaft.agh.edu.pl!news.memax.krakow.pl!news.astercity.net!news.icm.edu.pl!news.ceti.com.pl!not-for-mail
From: Piotr Piatkowski <kompas@ceti.com.pl>
Newsgroups: pl.comp.objects
Subject: Inicjalizacja obiektów globalnych w bibliotekach
 dynamicznych
Date: 4 Mar 1999 10:31:40 GMT
Organization: CETI internet access, Krakow
Lines: 42
Message-ID: <7blnec$qo8$1@druid.ceti.com.pl>
NNTP-Posting-Host: tau.ceti.com.pl
Mime-Version: 1.0
User-Agent: tin/pre-1.4-981002 ("Phobia") (UNIX) (Linux/2.1.126 (i686))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit