|
dev.gamez.lv Latvian Game Developers Community
|
View previous topic :: View next topic |
Author |
Message |
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: 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 |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
|
|
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
|