Autor Wątek: Problem z dll.  (Przeczytany 5683 razy)

Offline novo

  • Użytkownik
    • my devblog

# Styczeń 18, 2006, 03:14:22
W swoim projekcie mam zamiar podzielic czesc kodu na dll'e. Mam nstd.dll(bilbioteka z podstawowymi typami, jak string, smartptr itd) i kernel.dll(czesc frameworka). Gdy dolaczam liba i dll nstd do dowolnej zwyklej aplikacji, to wszystko dziala bez zarzutu. Ale jak chcialem dodac tak samo nstd.dll do kernel.dll, to budujac dostaje unresolved external, oto wycinek kodu:

namespace nstd{
  class EXPORT String{
  public:
    // konstruktory, metody itd.
  protected:
    static std::vector<wchar_t*> m_unicodeAllocs;
   // i dalej reszta.
  };
}

A oto blad:
Console.obj : error LNK2001: unresolved external symbol "protected: static class std::vector<wchar_t *,class std::allocator<wchar_t *> > nstd::String::m_unicodeAllocs" (?m_unicodeAllocs@String@nstd@@1V?$vector@PA_WV?$allocator@PA_W@std@@@std@@A)
ConsoleAlias.obj : error LNK2001: unresolved external symbol "protected: static class std::vector<wchar_t *,class std::allocator<wchar_t *> > nstd::String::m_unicodeAllocs" (?m_unicodeAllocs@String@nstd@@1V?$vector@PA_WV?$allocator@PA_W@std@@@std@@A)
E:\Programming\Projects\C++\ionic_engine\\bin\kernel\kerneld.dll : fatal error LNK1120: 1 unresolved externals
Build log was saved at "file://e:\Programming\Projects\C++\ionic_engine\vsfiles\kernel\obj\Debug\BuildLog.htm"
kernel - 3 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========

Czepia sie tylko tej jednej statycznej skladowej, nie mam pojecia o co chodzi :/ Bylbym wdzieczny za pomoc :)

Pozdr!
novo.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline puch

  • Użytkownik

# Styczeń 18, 2006, 12:14:41
Ja mam takie pytanko - W jaki sposób dodałeś swoją bibliotekę do kernel.dll? ::)

Offline novo

  • Użytkownik
    • my devblog

# Styczeń 18, 2006, 14:20:57

Tak dodaje lib'a:

#ifdef _DEBUG
#pragma comment(lib, "E:\\Programming\\Projects\\C++\\ionic\\bin\\nstd\\nstdd.lib")
#else
#pragma comment(lib, "E:\\Programming\\Projects\\C++\\ionic\\bin\\nstd\\nstd.lib")
#endif

Pozdr!
novo.

Offline puch

  • Użytkownik

# Styczeń 18, 2006, 15:25:12
Rozumiem, że kompilujesz wszystko w unikodzie i korzystasz z unikodowych wersji funkcj? Hmm...spróboj zastąpić wchar_t* na char_t*, albo sprawdź dokładnie kod czy gdzieś przy deklaracjach -definicjach nie masz jakiejś pomyłki. Wiecej nic nie wymyśle :-[
Pozdrawiam

Offline mINA87

  • Użytkownik

# Styczeń 18, 2006, 15:35:47
Witam!
Powyższy problem z eksportowaniem szablonów jest świetnie opisany tutaj:
http://www.codeproject.com/cpp/MemberTemplateDLL.asp
Pozdro.

Offline novo

  • Użytkownik
    • my devblog

# Styczeń 18, 2006, 19:35:13
Nie bardzo widze zwiazek z moim problemem. Tam autor wyjasnia jak sobie poradzic z eksportowaniem metod szablonowych. A mi chodzi o pole statyczne klasy. Szablon jest definiowany w dlli. Moze powiniem dac kod wczesniej ale to wyglada tak:

//String.cpp
namespace nstd{
  //...
  EXPORT std::vector<wchar_t*> String::m_unicodeAllocs; // Nie ma znaczenia czy dam EXPORT czy nie.
}

EDIT:
puch, w kodzie raczej nie ma bledu. Jak juz pisalem, jezeli nstd.dll dolaczam do dowolnej aplikacji to wszystko dziala. Tylko jak teraz dolaczylem do dll'a to cos sie sypie.
Dostaje jeszcze taki warning jak buduje nstd.dll:
e:\programming\projects\c++\ionic_engine\src\nstd\string.h(169) : warning C4251: 'nstd::String::m_unicodeAllocs' : class 'std::vector<_Ty>' needs to have dll-interface to be used by clients of class 'nstd::String'
        with
        [
            _Ty=wchar_t *
        ]
I nie umiem tego usunac. Eksportuje cala klase, jak zmienilem definicje na:
namespace nstd{
  class EXPORT String{
  public:
    // konstruktory, metody itd.
  protected:
    EXPORT static std::vector<wchar_t*> m_unicodeAllocs;
   // i dalej reszta.
  };
}
to dostaje:
e:\programming\projects\c++\ionic_engine\src\nstd\string.h(169) : error C2487: 'm_unicodeAllocs' : member of dll interface class may not be declared with dll interface
e:\programming\projects\c++\ionic_engine\src\nstd\string.h(169) : warning C4251: 'nstd::String::m_unicodeAllocs' : class 'std::vector<_Ty>' needs to have dll-interface to be used by clients of class 'nstd::String'
        with
        [
            _Ty=wchar_t *
        ]

Pozdr!
novo.
« Ostatnia zmiana: Styczeń 18, 2006, 19:40:33 wysłana przez novo »

Offline mINA87

  • Użytkownik

# Styczeń 18, 2006, 20:37:26
A ja ciągle obstaje przy tym że to jest ta sama klasa problemów :F
Ale tak: albo eksportujesz całość, albo poszczególnych członków klasy, nie można tak i tak bo to nei ma sensu :] - Eksport klasy implikuje eksport każdego z członków :]
Hmm nie zagłębiałem się w Twój problem, ale z tego co przejżałem dokumentacje u żródełka
(http://support.microsoft.com/default.aspx?scid=kb;en-us;168958)
to niby wszystko jest ok. Może runtime'y ? Zobacz czy masz wszędzie to samo czyli Multithreaded DLL.

Offline novo

  • Użytkownik
    • my devblog

# Styczeń 18, 2006, 20:57:59
Wszedzie jest multithread dll/multithread debug dll, to byla pierwsza rzecz ktora sprawdzilem.

Jeszcze dodam ze kompilator to VC++ 2k5 express.

Pozdr!
novo.

Offline novo

  • Użytkownik
    • my devblog

# Styczeń 18, 2006, 21:50:12
Zgodnie z prosba tu jest kod. Wycialem z tamtad 2 projekty testowe(konsolowy i windowsowy), ale to nie ma znaczenia, bo tamto po prostu poligon doswiadczalny na ktorych sobie testuje rozne rzeczy zanim dodam do 'silnika'.

Pozdr!
novo.

bies

  • Gość
# Styczeń 18, 2006, 23:12:28
Ide spac przerobie jutro. Masz tam troche balaganu. Kompletnie Ci sie pokrecila koncepcja __declspec(dllexport)/__declspec(importport).
Masz takie kwiatki jak w obu dll-kach zdefiniowane IONIC_EXPORT ktore uzywasz do exportu oraz  importu - to jezt ZLE.

kazda dll-ka powinna miec wlasne makro.

Kolejny kwiatek :

#ifdef _USRDLL
/// Dll exporting macro.
#define IONIC_EXPORT __declspec(dllexport)
#else
#define IONIC_EXPORT __declspec(dllimport)
#endif

To sprawia ze w obu dll-kach masz IONIC_EXPORT zdefiniowane jako export - dlaczego tam jest _USERDLL ? a nie np NSTD_EXPORTS jak masz w projekcie ?

Exportowe IONIC_EXPORT powoduje, ze linker nie szuka "jumperkowego" externalka (do osobnej dll), tylko oczekuje zwyklego.

To generalnie glowne bledy (moze beda inne) - powinny Cie naprowadzic ;). Jak nie dasz radyto jutro podesle poprawione (ale juz mysle, ze powinno to Cie naprowadzic :])
« Ostatnia zmiana: Styczeń 18, 2006, 23:17:40 wysłana przez st3tc »

Offline novo

  • Użytkownik
    • my devblog

# Styczeń 19, 2006, 04:02:08
Thx st3tc. Pomoglo :D. To moj pierwszy projekt ktory dziele na dll, wiec jeszcze nie jestem do tego przyzwyczajony i jak widac takie banalne bledy sie trafiaja :). Nawet nie pomyslalem ze blad moze byc w makrze IONIC_EXPORT :)

Pozdr!
novo.

Offline yorp

  • Użytkownik
    • ProfessionGG Project

# Styczeń 19, 2006, 11:21:25
OT: ogolnie dll to bardzo przyjemna sprawa, wedlug mnie jedna z nielicznych rzeczy, ktora sie microsoftowi w windowsie udala

Offline HellCat

  • Użytkownik

# Luty 01, 2006, 13:49:03
Cześć.

Nie chciałem zakładać nowego tematu, więc zapytam się tutaj.

Czy może ktoś podesłać jakieś materiały o tworzeniu DLL'i
Szukałem i znajduje tylko co jedynie pytania o jakiś problem przy tworzeniu, ale nic o samym tworzeniu "step by step", dla kogoś kto jeszcze nie zna tematu.
A nie bardzo widzi mi się iść do księgarni i kupic dzisiaj ksiażke za 80zł tyko po to (chociaż to pewnie byłoby jakieś rozwiązanie )

Pzdr.

Offline novo

  • Użytkownik
    • my devblog

# Luty 01, 2006, 14:59:35
Jezeli masz perelki to w drugim tomie sa 2 rozdzialy o dll'ach. Jezeli nie masz perelek to najwyzszy czas sie w nie zaopatrzyc :). Pozatym w sieci jest mnostwo artow o tym. Nie bede tu wklejal linkow bo z google musi umiec korzystac kazdy.

Pozdr!
novo.

bies

  • Gość
# Luty 01, 2006, 15:10:50
Novo: kupować ,,Perełki'' tylko dla kilku kartek o dll'ach?

HellCat: prosty wstęp najdziesz w [1], a [2] i [3] wyguglałem w parę(naście) sekund. Hasło ,,C++ dll tutorial''.

[1] http://mingw.org/docs.shtml#compilingandbuilding
[2] http://www.programmersheaven.com/zone15/articles/article279.htm
[3] http://www.codeproject.com/dll/