Article View: pl.comp.objects
Article #5028Inicjalizacja obiektów globalnych w bibliotekach dynamicznych
From: Piotr Piatkowski
Date: Thu, 04 Mar 1999 10:31
Date: Thu, 04 Mar 1999 10:31
42 lines
2655 bytes
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-mailShow 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