[C++] dll probleem (Linker Error)

Pagina: 1
Acties:

  • krietjur
  • Registratie: Februari 2001
  • Laatst online: 09-09 18:53

krietjur

Where am I?

Topicstarter
Ik heb met Borland C++ Builder een programma gemaakt, en daarin wil gebruik maken van dll's om daar es wat mee te testen.. Nou heb ik uit het bestand MainForm.cpp een functie gecut en die in een dll "geplakt". Include van de dll in orde gemaakt, __export toegevoegd etc.

Dit werkt allemaal helemaal goed. Maar nu wil ik het volgende: in MainForm.cpp heb ik een functie "blaat()" staan. Die wil ik vanuit de dll gaan aanroepen, maar dit werkt dus niet.. :?

Ik krijg dan de volgende error:


[LinkerError] Unresolved external 'TMainFrame::blaat()' referenced from C:\WINDOWS\DESKTOP\DLLDING\TXTDLL.OBJ.


'k zal vast wel iets knulligs over het hoofd zien aangezien ik nogal newbie ben met dll's, ben er nu al een tijd mee bezig en wordt er een beetje moedeloos van nu.. :'(

Iemand een idee hoe ik dit kan oplossen?

  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 05:27
Ehhh... ik ben ook maar een leek, maar moet je ook niet een dllimport doen?

  • krietjur
  • Registratie: Februari 2001
  • Laatst online: 09-09 18:53

krietjur

Where am I?

Topicstarter
Ik heb via de ProjectManager de DLL toegevoegd aan m'n programma.. en als ik die aanroep naar blaat() weghaal dan werkt het wel allemaal goed..

  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 05:27
Ik bedoel met import eigenlijk niet dat je hem toevoegt aan je project, maar dat je __declspec(dllimport) ergens in je programma hebt staan. Ik weet niet of je dat al hebt gedaan?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op woensdag 24 april 2002 13:36 schreef krietjur het volgende:
Ik heb via de ProjectManager de DLL toegevoegd aan m'n programma.. en als ik die aanroep naar blaat() weghaal dan werkt het wel allemaal goed..
Je moet niet de DLL maar de LIB toevoegen via de Project Manager.

Het hele idee achter DLL is dat ie dynamisch is en dus niet meegelinkt hoeft te worden. Daarvoor wordt er bij een DLL altijd een LIB meegegenereerd die als 'runtime wegwijzer' binnen de DLL fungeert.

Professionele website nodig?


  • krietjur
  • Registratie: Februari 2001
  • Laatst online: 09-09 18:53

krietjur

Where am I?

Topicstarter
Op woensdag 24 april 2002 13:52 schreef curry684 het volgende:

[..]

Je moet niet de DLL maar de LIB toevoegen via de Project Manager.

Het hele idee achter DLL is dat ie dynamisch is en dus niet meegelinkt hoeft te worden. Daarvoor wordt er bij een DLL altijd een LIB meegegenereerd die als 'runtime wegwijzer' binnen de DLL fungeert.
Ik leg het misschien verkeerd uit ;) Via de projectmanager doe ik add en dan voeg ik een .lib bestand toe..
Op woensdag 24 april 2002 13:42 schreef DrClearbottom het volgende:
Ik bedoel met import eigenlijk niet dat je hem toevoegt aan je project, maar dat je __declspec(dllimport) ergens in je programma hebt staan. Ik weet niet of je dat al hebt gedaan?
Nee dat heb ik niet gedaan.. ik heb in de dll staan:
void __export blaat(), maar waar moet ik dan die __declspec(dllimport) plaatsen?

En nog ff voor de duidelijkheid.. zonder die aanroep naar blaat() werkt alles gewoon goed, dus ook de dll werkt dan wel..

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op woensdag 24 april 2002 13:13 schreef krietjur het volgende:

[LinkerError] Unresolved external 'TMainFrame::blaat()' referenced from C:\WINDOWS\DESKTOP\DLLDING\TXTDLL.OBJ.
Dit kan trouwens helemaal niet... als deze error klopt probeer je member methods van een class te exporteren uit een DLL, en dat kan absoluut niet. Alleen globale methods (bij voorkeur extern "c" tegen name mangling troep) kunnen uit een DLL geexporteerd worden.

Professionele website nodig?


  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 05:27
Ik weet het ook niet helemaal precies, maar ik denk dat hier en hier wel wat uitleg te vinden is.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-09 00:49
Op woensdag 24 april 2002 14:26 schreef curry684 het volgende:

[..]

Dit kan trouwens helemaal niet... als deze error klopt probeer je member methods van een class te exporteren uit een DLL, en dat kan absoluut niet. Alleen globale methods (bij voorkeur extern "c" tegen name mangling troep) kunnen uit een DLL geexporteerd worden.
Ehm...je kunt wel class methods exporteren; dat is dus waar je name mangling voor nodig hebt. Sterker nog, MSVC's default DLL (uit de Wizard) laat zelfs zie hoe.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op woensdag 24 april 2002 18:15 schreef MSalters het volgende:
Ehm...je kunt wel class methods exporteren; dat is dus waar je name mangling voor nodig hebt. Sterker nog, MSVC's default DLL (uit de Wizard) laat zelfs zie hoe.
Allereerst: ook global functions kunnen meerdere parameterlijsten accepteren, waarvoor name mangling nodig is.

En vervolgens: exact welke this pointer moet die class method aanhouden als ie los geexporteerd wordt? Je moet dan ook de constructor(s) exporteren en de class instantieren uit de DLL.

Professionele website nodig?


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 06-09 22:39
Op woensdag 24 april 2002 13:42 schreef DrClearbottom het volgende:
... __declspec(dllimport) ...
Is dit niet MS specific ? Of kent BCPP die ook?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-09 00:49
Op woensdag 24 april 2002 18:22 schreef curry684 het volgende:

[..]

Allereerst: ook global functions kunnen meerdere parameterlijsten accepteren, waarvoor name mangling nodig is.
Helemaal waar - die ook. En operators ook. en templates. Eiegnlijk alles wat niet in C zat.
En vervolgens: exact welke this pointer moet die class method aanhouden als ie los geexporteerd wordt? Je moet dan ook de constructor(s) exporteren en de class instantieren uit de DLL.
Welke 'this' pointer aangehouden moet worden maakt niet uit. De 'this' pointer wordt namelijk door de caller aangeleverd: pA->member() levert this==pA op.
Dat doet niets af aan het encapsulatie principe, wat zegt dat je dingen die bij elkaar horen, bij elkaar horen. ;)
Dus alle class methods horen bij elkaar in een DLL volgens dit principe.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1