[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

pl.comp.programming

wlasna biblioteka DLL z klasami STL (dosc dlugie

TmP

8/15/2007 2:21:00 AM

Witam!

Stworzylem pewna wlasna biblioteke DLL z wykozystaniem pewnych klas z QT
4.x. Byly to kontenery (QList), string (QString) i strumienie (QDataStream).
Zadnych tam cudow wiankow typu SIGNAL-SLOT i innych Qt-wynalazko.
Tworzac goly projekt czy to MFC czy to Qt moge spokojnie zaimportowac ta
biblioteke i korzystac z klas w niej zawartych.

Wszystko cacy, postanowilem uzyc jej w pewnym dosc starym projekcie open
source (zaczale sie 7 lat temu i bazuje na jeszcze straszym projekcie) i
generalnie rzecz biorac byly same problemy poczawszy od tego, ze zarowno w
Qt byly zdefiniowane pewne typy (np. uchar, uint) jak i w tym projekcie open
source. Z racji tego, ze slabo znam ten projekt i nie chcac go
przebudowywac, doszedlem do wniosku, ze rzuce Qt i skorzystam z STLowych
list, stringow oraz ifstream i ofstream. Zakldajac, ze z ta biblioteka nie
powinno byc problemow.

Przepisalem calosc na STL, skompilowalem i...qpa.
Na dzien dobry kompilator traktuje mnie takim warningiem:
warning C4251: 'FooClass::vektorek' : class 'std::vector<_Ty>' needs to have
dll-interface to be used by clients of class 'FooClass'

Hmm...warning jak warning, zawsze mozna go wylaczyc :P

Ale kolejne bledy juz oslabily mnie zlekka.

error C2146: syntax error : missing ')' before identifier 'info'

error C2146: syntax error : missing ';' before identifier 'info'

error C2460: 'BarClass::string' : uses 'BarClass', which is being defined :
see declaration of 'BarClass'

error C2143: syntax error : missing ';' before '.'

error C4430: missing type specifier - int assumed. Note: C++ does not
support default-int

error C2059: syntax error : ')'

error C2238: unexpected token(s) preceding ';'

Wszystko odnosi sie do jednej liniki kodu, deklaracji konstruktora:

BarClass (string _name, double , double );

Klasa BarClass posiada 2 pola (reszte funkcji i pol wycialem)

string name;

FooClass costam; //tu trzeba zaznaczyc, ze FooClass posiada std::vector
<costam*> vektorek;

Po wywaleniu tego kontruktora, biblioteka (taka mocno przetrzebiona, ale do
wybadania gdzie jest problem w sam raz) w tym opensource'owym projekcie
kompiluje sie, z konstruktorem, ktory zawiera klase STL sie sypie.

W ruch poszly google i dotarlem do tego dokumentu:

How to export an instantiation of a Standard Template Library (STL) class
and a class that contains a data member that is an STL object

http://support.microsoft.com/k...

Przeczytalem i dalej nie wiem co robic szczerze powiedziawszy.

Jak w podanym przykladzie uzylem takiego makra:
#ifdef EXP_STL
# define DECLSPECIFIER __declspec(dllexport)
# define EXPIMP_TEMPLATE
#else
# define DECLSPECIFIER __declspec(dllimport)
# define EXPIMP_TEMPLATE extern
#endif

ponad to przed deklaracja klasy FooClass umiescilem cos takiego:
EXPIMP_TEMPLATE template class DECLSPECIFIER std::vector<int>;
w moim przypadku to wygladalo tak:
EXPIMP_TEMPLATE template class DECLSPECIFIER std::vector<costam*>;

Tylko za chiny ludowe nie moge zrozumiec o co w tym kawalku kodu chodzi
(zwlaszcza ten znak wiekszosci w nawiasie i ta kropka po c):
public:
bool operator < (const MyClass > c) const
{
return VectorOfInts < c. VectorOfInts;
}
bool operator == (const MyClass > c) const
{
return VectorOfInts == c. VectorOfInts;
}


W tym momencie zwatpilem. Zwlaszcza po przeczytaniu tekstu, ze niektorych
klas STL (map, set, queue, list, deque) sie nie da eksprotowac (prawie
zalamka, bo w dalszczej czesci kodu uzywam std::list). Prawie, bo
ostatecznie moge uzyc vectora :-/.

Co ciekawe spokojnie moge uzyc mojej biblioteki zarowono w nowo stworzonym
projekcie Qt C++, jak MFC. A w tym zafajdanym projekcie opensource (na ktory
jestem skazany) ni cholery nie idzie.

No i teraz nie wiem co robic. Kurna, no to jakich kontenerow mialbym uzyc,
zeby ten moj kod byl przenosny. Juz myslalem, ze Qt bedzie ok, wszak to taka
multi-platformowa biblioteka, a gdzie tam. To pomyslalem, ze moze stare
sprawdzone STL - zalamka. Wiec co? Boost? Tylko mi nie propnujcie, zebym
zamiast stringow uzyl char* i zamiast konteru vector uzyl T*, bo to
przechodzi moje sily (o czasie juz nie wspominajac).
Moze to o konfuguracje projektu sie rozbija?


z gory dzieki za pomoc
zalamany
TmP



12 Answers

Marcin 'Qrczak' Kowalczyk

8/15/2007 7:29:00 AM

0

Dnia 15-08-2007, Sr o godzinie 04:20 +0200, TmP napisal(a):

> bool operator < (const MyClass > c) const

Ten > jest bez sensu, powinno byc &:

bool operator < (const MyClass & c) const

> {
> return VectorOfInts < c. VectorOfInts;

Przeciez kropke znasz. Tylko zwykle nie pisze sie po niej spacji.

--
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrnik.knm.org.p...

darek

8/15/2007 10:33:00 AM

0

TmP pisze:
> Witam!
>
> Stworzylem pewna wlasna biblioteke DLL z wykozystaniem pewnych klas z QT
> 4.x. Byly to kontenery (QList), string (QString) i strumienie (QDataStream).
> Zadnych tam cudow wiankow typu SIGNAL-SLOT i innych Qt-wynalazko.
> Tworzac goly projekt czy to MFC czy to Qt moge spokojnie zaimportowac ta
> biblioteke i korzystac z klas w niej zawartych.
>
> Wszystko cacy, postanowilem uzyc jej w pewnym dosc starym projekcie open
> source (zaczale sie 7 lat temu i bazuje na jeszcze straszym projekcie) i
> generalnie rzecz biorac byly same problemy poczawszy od tego, ze zarowno w
> Qt byly zdefiniowane pewne typy (np. uchar, uint) jak i w tym projekcie open
> source. Z racji tego, ze slabo znam ten projekt i nie chcac go
> przebudowywac, doszedlem do wniosku, ze rzuce Qt i skorzystam z STLowych
> list, stringow oraz ifstream i ofstream. Zakldajac, ze z ta biblioteka nie
> powinno byc problemow.
>
> Przepisalem calosc na STL, skompilowalem i...qpa.
> Na dzien dobry kompilator traktuje mnie takim warningiem:
> warning C4251: 'FooClass::vektorek' : class 'std::vector<_Ty>' needs to have
> dll-interface to be used by clients of class 'FooClass'
>

Jak sobie radzia z tym ostrze?eniem dosya dok3adnie napisane jest tutaj:

http://www.unknownroad.com/rtfm/VisualStudio/warning...

Pozdrawiam
Darek

darek

8/15/2007 10:37:00 AM

0

Darek pisze:

>> Przepisalem calosc na STL, skompilowalem i...qpa.
>> Na dzien dobry kompilator traktuje mnie takim warningiem:
>> warning C4251: 'FooClass::vektorek' : class 'std::vector<_Ty>' needs
>> to have
>> dll-interface to be used by clients of class 'FooClass'
>>
>
> Jak sobie radzia z tym ostrze?eniem dosya dok3adnie napisane jest tutaj:
>
> http://www.unknownroad.com/rtfm/VisualStudio/warning...
>

i tutaj:

http://www.unknownroad.com/rtfm/VisualStudio/warning...

darek

8/15/2007 10:38:00 AM

0

Darek pisze:
> TmP pisze:
>> Przepisalem calosc na STL, skompilowalem i...qpa.
>> Na dzien dobry kompilator traktuje mnie takim warningiem:
>> warning C4251: 'FooClass::vektorek' : class 'std::vector<_Ty>' needs
>> to have
>> dll-interface to be used by clients of class 'FooClass'
>>
>
> Jak sobie radzia z tym ostrze?eniem dosya dok3adnie napisane jest tutaj:
>
> http://www.unknownroad.com/rtfm/VisualStudio/warning...
>


i tutaj:
http://support.microsoft.com/k...

--
Pozdrawiam
Darek
http://pl.cpp....

Jakub Debski

8/15/2007 11:10:00 AM

0

on 2007-08-15, TmP supposed :
> source. Z racji tego, ze slabo znam ten projekt i nie chcac go
> przebudowywac, doszedlem do wniosku, ze rzuce Qt i skorzystam z STLowych
> list, stringow oraz ifstream i ofstream. Zakldajac, ze z ta biblioteka nie
> powinno byc problemow.

je?eli po dwóch stronach masz kod, który nie potrafi? sie ze sob?
dogadaa, to zastosuj wzorzec fasady.

pozdrawiam
Jakub


TmP

8/15/2007 12:24:00 PM

0


"Marcin 'Qrczak' Kowalczyk" <qrczak@knm.org.pl> wrote in message
news:1187162940.30477.1.camel@qrnik...
Dnia 15-08-2007, ¦r o godzinie 04:20 +0200, TmP napisa³(a):

> bool operator < (const MyClass > c) const

Ten > jest bez sensu, powinno byæ &:

bool operator < (const MyClass & c) const

> {
> return VectorOfInts < c. VectorOfInts;

Przecie¿ kropkê znasz. Tylko zwykle nie pisze siê po niej spacji.


No tak... sam moglem na to wpasc :) Ale po ponad 12 godzinach sleczenia
przed monitorem nie wpadlem na to :)
Dzieki. Zobacze co sie da z tego wycisnac...o ile da. Jakis taki niesmak ma
po tym STLu.

TmP


TmP

8/15/2007 12:27:00 PM

0


"Darek" <chq_at_wp_pl@spam.pl> wrote in message
news:f9ul29$b5s$4@inews.gazeta.pl...
> Darek pisze:
>> TmP pisze:
>>> warning C4251: 'FooClass::vektorek' : class 'std::vector<_Ty>' needs to
>>> have
>>> dll-interface to be used by clients of class 'FooClass'
>>>
>>
>> Jak sobie radziæ z tym ostrze¿eniem dosyæ dok³adnie napisane jest tutaj:
>>
>> http://www.unknownroad.com/rtfm/VisualStudio/warning...
>>

> i tutaj:
> http://support.microsoft.com/k...
>

Dzieki za ten pierwszy artykul. Dokument Microsoftu juz czytalem wczesniej
:)

pozdrawiam
TmP


TmP

8/16/2007 1:43:00 PM

0


"Jakub Debski" <debski.jakub@wp.pl> wrote in message
news:mn.7b157d78a999a79e.68470@wp.pl...
> on 2007-08-15, TmP supposed :
>> source. Z racji tego, ze slabo znam ten projekt i nie chcac go
>> przebudowywac, doszedlem do wniosku, ze rzuce Qt i skorzystam z STLowych
>> list, stringow oraz ifstream i ofstream. Zakldajac, ze z ta biblioteka
>> nie
>> powinno byc problemow.
>
> je¿eli po dwóch stronach masz kod, który nie potrafi± siê ze sob± dogadaæ,
> to zastosuj wzorzec fasady.
>
Na pierwszy rzut oka pomysl by mi sie prawie nadal, ale. Zrobilem klase
fasady w tym projekcie opensource, w innym pliku zrobilem klase (niech
bedzie classA) ktora wykorzystuje "klasaZMoiejejDLLki.h" i co ciekawe nawet
sie kompilowalo bez problemow. Nawet dodanie w pliku classA.h #include
"fasada.h", ktora to jakby nie bylo zawiere wiele "outsourceoweHeadery.h"
nie powodowalo rzadnych bledow. Dodam, ze uzylem ze uzylem tu mojejDLLki w
wersji Qt.

Swojej biblioteki DLL chce uzyc w projekcie, ktory tworzy ta inna biblioteke
DLL.
Umieszczenie #included "klasaZMoiejejDLLki.h" w pliki $(ProjectName).cpp
(tam gdzie sie znajduje entry point DLLki tego ousourcowego projektu),
powoduje wysyp dwudziestu kilku absurdalnych bledow (absurdalnych bo opis
bledow nijak nie odpowiada do miejsca wskazywanego bledu; to troche jak zje
sie ';' na koncu deklaracji klasy i potem wysypuje sie stado bezsensownych
bledow)

Co z tego, ze zrobie klase fasada zadeklarowana w fasada.h, ktora dolacze do
$(ProjectName).cpp oraz fasada.h moge dolaczyc w pliku classA.h, skoro jakos
musze swtorzyc instancje klasy classA. Czyli tak czy siak musze zrobic
#inlcude "classA.h", ktory to zawiera #include "klasaZMojejeDLLki.h" albo w
pliku fasada.h, albo w pliku $(ProjectName).cpp, co powoduje wysyp
wspomnianych bledow.

Moze sie myle i da sie to jakos zrobic. Szczerze powiedziawszy, to bardzo
chcialbym sie mylic :)

pozdrawiam i dzieki za rady
TmP


Jakub Debski

8/16/2007 2:29:00 PM

0

TmP wrote on 2007-08-16 :
> "Jakub Debski" <debski.jakub@wp.pl> wrote in message
> news:mn.7b157d78a999a79e.68470@wp.pl...
> Co z tego, ze zrobie klase fasada zadeklarowana w fasada.h, ktora dolacze do
> $(ProjectName).cpp oraz fasada.h moge dolaczyc w pliku classA.h, skoro jakos
> musze swtorzyc instancje klasy classA. Czyli tak czy siak musze zrobic
> #inlcude "classA.h", ktory to zawiera #include "klasaZMojejeDLLki.h" albo w
> pliku fasada.h, albo w pliku $(ProjectName).cpp, co powoduje wysyp
> wspomnianych bledow.

a o redukowaniu zale?no?ci np. za pomoc? pImpl s3ysza3e??

pozdrawiam
Jakub


TmP

8/16/2007 2:43:00 PM

0


"Jakub Debski" <debski.jakub@wp.pl> wrote in message
news:mn.83dc7d78f63ce877.68470@wp.pl...
> TmP wrote on 2007-08-16 :
>> "Jakub Debski" <debski.jakub@wp.pl> wrote in message
>> news:mn.7b157d78a999a79e.68470@wp.pl...
> a o redukowaniu zale¿no¶ci np. za pomoc± pImpl s³ysza³e¶?
>

Nie, ale chetnie uslysze :).
Jezeli bysbyl tak uprzejmy i mi to krotko zreferowal bylbym wdzieczny.

pozdrawiam
TmP

ps. google tez uzyje :)