dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Publiskie klases mainīgie iekš DLL
Goto page 1, 2  Next
 
dev.gamez.lv Forum Index -> Programmēšana
View previous topic :: View next topic  
Author Message
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Aug 23, 2006 11:16 am    Post subject:

A tev ir pareizs headeris dll faila importēšanai?
Code:
namespace MyLib
{
     class __declspec(dllimport) MyClass
     {
     public:
         static int x;
     };
}

Un tu linko ar savu dll_file.lib bilbliotēku kopā?
Back to top
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Aug 23, 2006 11:29 am    Post subject:

Kad tu kompilē savu programmu, kura grib izmantot šo klasi no tava dll faila - tad kādu header failu tu inklūdē? Ja to, kuru norādīji sākumā, tad tas ir nepareizi. __declspec(dllexport) direktīva nozīmē, ka tu gribi eksportēt šo klasi. Taču kompilējot aplikāciju, tev kompilētājam jāpasaka, ka tu gribi importēt šo klasi no dll failu - jo pašam tev programmā tās nav. Tāpēc jānorāda __declspec(dllimport) kā es rakstīju. Tb tev jābūt headerim kā manā piemērā, kad kompilē aplikāciju, kura grib do dll izmantot.

A vispār - kam tev dll failus? Nav vienkāršāk statiskas bibliotēkas izmantot? Es vēl saprastu, ja tev vajag no citām valodām piekļūt šim dll failam, taču tad jau vajadzētu C veida exportus taisīt (extern "C").

programmer wrote:
Jā, linkoju .lib, savaadaak jau nedarbotos arii f-jas.

Bet nedarbojas taču - linkeris met kļūdu. Tāpēc jau prasu - vai tiešām linko?
Back to top
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Aug 23, 2006 12:22 pm    Post subject:

Ja statiskai bibliotēkai arī ir tāda pati kļūda, tad vai nu neesi iekļāvis .lib failu projektā (lietojot MSVC - vai nu solution explorerī, vai pie linkera settingiem). Vai arī neesi pareizi izveidojis to statisku bibliotēku, tb neesi iekļāvis .cpp/.h failu, kurā šis statiskais mainīgais ir deklarēts (nevis definēts).

Last edited by bubu on Wed Aug 23, 2006 12:51 pm; edited 1 time in total
Back to top
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Aug 23, 2006 12:51 pm    Post subject:

A tu mainīgo vispār esi definējis? Vai arī tev tikai šī deklarācija .h failā ir?
Deklarācija jau pasaka kompilētājam, ka tāds mainīgais būs. Linkerim jau vajadzīga tā definīcija, kura reāli izdala atmiņā vietu mainīgajam.

Tieši tāpat kā ar funkcijām - tu viņas definē .h failā, tb pasaki, kompilētājam, ka kautkur tev tādas fjas ir, un šis ģenerē atbilstošu kodu (to fju izsaukumus). Taču linkerim, kas savelk kopā programmas moduļus (atsevišķos .cpp failus/bibliotēkas), jau vajag lai fjas un mainīgie būtu definēti arī.
Back to top
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Aug 23, 2006 1:32 pm    Post subject:

Nezinu kā tev, bet man darbojas:
Fails my_dll.h
Code:
#ifdef COMPILING_DLL
#define MYAPI __declspec(dllexport)
#else
#define MYAPI __declspec(dllimport)
#endif

namespace MyLib
{
  class MYAPI MyClass
  {
  public:
    static int x;
  };
}


Fails my_dll.cpp
Code:
#define COMPILING_DLL
#include "my_dll.h"

namespace MyLib
{
  int MyClass::x = 1;
}


Fails my_exe.cpp
Code:
#include "my_dll.h"
#include <iostream>

int main(void)
{
  std::cout << MyLib::MyClass::x << std::endl;
  return 0;
}


To visu kompilēju komandrindā (ar GCC):
Code:
g++ -s -mdll -omy_dll.dll -Wl,--out-implib,libmy_dll.a my_dll.cpp
g++ -s -omy_exe.exe my_exe.cpp libmy_dll.a

Iznāk trīs faili: my_dll.dll (dll fails), libmy_dll.a (dll faila importa bibliotēka), my_exe.exe (exe fails, kurš izmanto dll failu).

Palaižu my_exe.exe, un tiek izvadīts skaitlis 1. It kā strādā ne? Ar studiju faili arī noteikti kompilētos - būtu tikai savādākas kompilēšanas opcijas.
Back to top
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Aug 23, 2006 2:15 pm    Post subject:

Nav jau obligāti abi jāliek ifdefā. Tas ir tikai viens no variantiem, tb tā kā es to parasti daru.

Vienkārši tad, kad tu kompilē dll failu, tur ir jābūt __declspec(dllexport). Bet kad kompilē programmu, kura grib importēt šīs/klases/fjas/mainīgos no dll faila, tad ir jābūt __declspec(dllimport).

Vienkārši nomainot uz dllimport abos gadījumos, protams, ka nestrādās, jo dll (un importa bibliotēka) vienkārši neeksportēs šo klasi. Tāpēc arī nevarēs salinkot programmu.
Back to top
View user's profile Send e-mail
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Wed Aug 30, 2006 10:02 pm    Post subject:

Ieksh Visual Studio vienkaarshaak ir izmantot preprocessor simbolu _EXPORTING,kas noraada,vai tiek kompileets DLL vai aplikaacija

Bubu kods izskatiisies shaadi:
Code:
#ifdef _EXPORTING
#define MYAPI __declspec(dllexport)
#else
#define MYAPI __declspec(dllimport)
#endif

namespace MyLib
{
  class MYAPI MyClass
  {
  public:
    static int x;
  };
}

_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Wed Aug 30, 2006 10:08 pm    Post subject:

Hmm...Tiko pats izmeegjinaaju to _EXPORTING simbolu,bet nestraadaaja.Dokumentaacijaa teikts,ka pie kompileeshanas jaabuut /D iesleegtam.Man ir,bet tik un taa nestraadaa.
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Aug 30, 2006 10:41 pm    Post subject:

Ko nozīmē "pie kompileeshanas jaabuut /D iesleegtam"?
/D parametrs jau kompilētājam definē preprocesora simbolu.
Ja tu gribi, lai tas _EXPORTING ir definēts, tad tev to arī vajag pie preprocesora komandām uzdefinēt (vai alternatīvi komandrindā cl.exe norādīt: /D_EXPORTING).

Bet katrā ziņā par tādu _EXPORTING pirmo reizi dzirdu. Ne VS C++ 2005 Express, ne MSDN 2005 neatrodu tādu _EXPORTING.

Cik es zinu Vizuālā Studija defaultā definē šādus preprocesora simbolus (tas protams ir tā, ka uztaisot projektu studija automātiski šādus simbolus saliek pie preprocesora settingiem. Pēc tam jau tu pats vari viņus mainīt/dzēst nost/likt jaunus klāt):
Application (GUI):_WINDOWS
Application (CLI): _CONSOLE
Static Library: _LIB
Dynamic Library: _USRDLL, xxx_EXPORTS (kur xxx ir projekta nosaukums)

Papildus tam ir NDEBUG vai _DEBUG attiecīgi Release un Debug buildos.
Back to top
View user's profile Send e-mail
Display posts from previous:   
dev.gamez.lv Forum Index -> Programmēšana All times are GMT + 2 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group