DLL knihovna a export funkce "Initialize" – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

DLL knihovna a export funkce "Initialize" – C / C++ – Fórum – Programujte.comDLL knihovna a export funkce "Initialize" – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
jurin
~ Anonymní uživatel
16 příspěvků
6. 9. 2013   #1
-
0
-

Zdravím všechny,

toto se netýká přímo C++ ale spíše Windows.

Přešel jsem z MS VS 6 na MS VS 10(2010) a má problém z exportem jedné funkce z nativní DLL.

Funkce exportuje pomocí .def souboru a mám problém pouze z jednou funkcí, která se jmenuje Initialize.

Všechny ostatní exportované funkce jsou OK, ale u této jediné mi linker zahlásí error LNK2001: unresolved external symbol Initialize. Přitom tělo funkce určitě existuje. Přitom stačí jenom změnit název funkce na třeba Initialize2 a už se to kompletně přeloží.

Setkali jste se někdo s něčím podobným? Kde by mohl být problém ?

Nahlásit jako SPAM
IP: 80.188.228.–
Reklama
Reklama
Martin Kozibrátka0
Stálý člen
6. 9. 2013   #2
-
0
-

Těžké je to takto tipnout.

Problém může být se špatně přilinkovanou knihovnou.

Ale s .def nemám zkušenost.

Jakým způsobem inicializuješ dll? Dynamicky nebo staticky?

Klidně sem dej nějakou ukázku

Nahlásit jako SPAM
IP: 188.120.221.–
Savana.cz - neomezený webhosting za pár kaček :)
jurin
~ Anonymní uživatel
16 příspěvků
6. 9. 2013   #3
-
0
-

Nerozumím co myslíš tímto "Jakým způsobem inicializuješ dll ?"

Mě nejde přeložit ta samotná dll knihovna.

Nahlásit jako SPAM
IP: 80.188.228.–
Martin Kozibrátka0
Stálý člen
6. 9. 2013   #4
-
0
-

Aha tak to promiň, špatně jsem to přečetl.

Zkus tento článek, třeba ti něco poradí:

http://www.tenouk.com/ModuleBB.html

sekce Importing and Exporting

Nahlásit jako SPAM
IP: 188.120.221.–
Savana.cz - neomezený webhosting za pár kaček :)
Grungy0
Super člen
7. 9. 2013   #5
-
0
-

Z chyby vyplýva, že linker nevie nájsť skompilované telo tej funkcie a je na tebe aby si našiel prečo.

Bez kódu sa ťažko radí, tak len môžem strieľať od brucha:

  • Máš definíciu funkcie v hlavičkovom súbore .h/.hpp?
  • Máš v .c/.cpp súbore kde je telo funkcie include na hlavičkový súbor s jeho definíciou?
  • Máš správne názvy v .def, .c aj .h súboroch?
  • Nie je možné že knižnica obsahuje dve funckie Initialize a linker sa potom nevie rozhodnúť ktorú má exportovať?
  • Neexportuješ náhodou funkciu Initialize na dvoch miestach (ak to robíš cez .def asi nie, ale môže tam byť niekde skrytá pragma export, či ako sa tomu hovorí)
  • Je telo tej funkcie nejakým includom spojená s hlavným vstupným bodom dll knižnice? Občas sa stáva, že kompilátor je taký múdry, že telá niektorých telá funkcií nekompiluje ak sa nikde nepoužívajú a potom ich linker nenájde.
     

Nahlásit jako SPAM
IP: 188.123.100.–
Prvý náznak hlúposti, je pocit geniality.
jurin
~ Anonymní uživatel
16 příspěvků
12. 9. 2013   #6
-
0
-

Ano, to co hlásí linker tomu rozumím. Jenom nevím proč to hlásí.

Tělo funkce Initialize určitě existuje.

Mám deklaraci v hlavičkovým souboru:  

BOOL WINAPI Initialize(BYTE Num,BYTE Timeout,DWORD Version);

Takto mám definici funkce ve zdrojovém souboru

BOOL WINAPI Initialize(BYTE Num,BYTE Timeout,DWORD Version)
{
	//....
	return TRUE;
}

Takto vypadá zápis v .def souboru 

LIBRARY     "BlaBla"
DESCRIPTION "This is production version of BlaBla library"

EXPORTS
	Initialize						@1

Ve zdrojovým souboru s tělem funkce mám include toho hlavičkového souboru.

Funkce Initialize je v celém projektu knihovny pouze jednou.

Exportuji pouze na jenom místě a to přes .def soubor.

Funkce žádným způsobem není spojena s hlavním vstupním bode DLL knihovny funkcí DllMain.

Znovu opakuji co jsem zjistil. Když změním název funkce třeba na Initialize2, všechno projde a funkce Initialize2 je normálně exportovaná z DLL knihovny.

A když všechno přeložím ve starým Visual Studiu 6 i s názvem Initialize, tak je všechno OK.

Jenom v tom novým VS ten název Initialize nějak vadí.

Nahlásit jako SPAM
IP: 80.188.228.–
jurin
~ Anonymní uživatel
16 příspěvků
16. 9. 2013   #7
-
0
-

Pokud by to někoho zajímalo, tak sem už objevil kde je problém.

Pokud runtime knihovnu linkujete staticky(Multi-threaded /MT), to jest knihovna LIBCMT.lib, tak tato knihovna obsahuje funkce jako např. Concurrency::details::GlobalNode::Initialize(unsigned short,unsigned short,unsigned long) nebo Concurrency::details::RealizedChore::Initialize(void (__cdecl*)(void *),void *) a linker se nedokáže rozhodnout kterou funkci Initialize použít.

Řešením je linkovat runtime knihovnu dynamicky, což se mě moc nehodí.

Já to vyřešil, že jsem svoji funkci Initialize přejmenoval na Initialize2a def soubor změnil na Initialize = Initialize2        @1

Nahlásit jako SPAM
IP: 80.188.228.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 69 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý