Toon posts:

[C++] unresolved external symbol dat toch bestaat

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb hier een stuk code overgenomen van "infozip".

Nu ik wil dit in mijn eigen projectje steken. Dus ik denk van hmmm, laten we gewoon de lib-source pakken & steek dit gewoon in mijn eigen projectje.

Nu compiled dat perfect, maar bij het linken gaat het mis.


"int __stdcall Wiz_SingleEntryUnzip(int,char * *,int,char * *,struct DCL *,struct USERFUNCTIONS *)"

Dan ik op zoek naar die functie en wonder boven wonder bestaat deze wel echt!
( en ik heb eventjes #pragma message ("testje") ervoor gezet om te zien of deze wel echt compiled, en dat is dus een "JA").

Nu snap ik wel als de linker gaat klagen over dat ik een onbestaande functie niet heb, maar dit snap ik nu dus niet...

Kan iemand enig licht verschaffen?

Verwijderd

Topicstarter
Ter info:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "./unzip/windll/decs.h"
extern "C" WXEXPORT bool IsCorrectFileType( const wxString& filename )
{
  if ( !wxFileExists(filename) )
    return false;

  bool bRes(false);
  try
  {
    char * fname = _strdup(filename.mbc_str());
    DCL options;
    memset( &options, 0, sizeof(DCL) );

    options.ntflag = 1;
    options.fQuiet = 2;

    int retval = Wiz_SingleEntryUnzip( 1, &fname, 0, NULL, &options, NULL );
    wxDELETE(fname);
  }
  catch( ... )
  {
    bRes = false;
  }

  return bRes;
}


Dit is waar ik het in oproep...
decs.h
C++:
1
2
int     WINAPI Wiz_SingleEntryUnzip(int, char **, int, char **,
                                    LPDCL, LPUSERFUNCTIONS);

(WINAPI resolved naar __stdcall)

windll.c
C++:
1
2
3
int WINAPI Wiz_SingleEntryUnzip(int ifnc, char **ifnv, int xfnc, char **xfnv,
   LPDCL C, LPUSERFUNCTIONS lpUserFunc)
{

  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

AFAIK, werkt dat alleen als je dezelfde compiler gebruikt, omdat de C++ namemangling per compiler nog wel eens wil verschillen. Ik ben niet helemaal zeker of dat bij windows ook zo is, maar op Linux is dat wel een probleem.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 25-05 22:48

Creepy

Tactical Espionage Splatterer

Als het aan de name mangling ligt kan je de functie Wiz_SingleEntryUnzip ook als extern "C" declareren om de name mangling te voorkomen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
wat ik geprobeerd heb ik die WINAPI te vervangen door CDECL (is define voor __cdecl). [Mijn project is ook __cdecl dus].

Dan geeft hij zelfde foutmelding, maar ipv __stdcall geeft hij __cdecl...

Nu als ik ze gewoon weglaat (die WINAPI) (en dus een soort van forwarded declaration van een functie bekom), dan geeft hij nog steeds die foutmelding, maar dan met __cdecl.

Dus ik vind dit uitermate vreemd...


Als ik extern "C" ervoor zet, geeft hij de foutmelding:
error C2059: syntax error : 'string'

8)7

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 25-05 22:48

Creepy

Tactical Espionage Splatterer

extern "C" int WINAPI Wiz_SingleEntryUnzip(int ifnc, char **.......) ??

Want die foutmelding die je geeft gaat over een heel ander stuk code ;) Maar met mijn kapotte glazen bol en zonder dat je code post kunnen we niet zo heel veel :)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Ik heb dit project eventjes geupload op:
http://www.karels0ft.be/ZIP.zip (226Kb)

C++:
1
2
3
extern "C" int WINAPI Wiz_SingleEntryUnzip(int ifnc, char **ifnv, int xfnc, char **xfnv,
   LPDCL C, LPUSERFUNCTIONS lpUserFunc)
{


resultaat:
code:
1
2
3
4
Compiling...
windll.c
c:\tmp\karels0ft\plugins\compression\zip\unzip\windll\windll.c(427) : error C2059: syntax error : 'string'
Error executing cl.exe.


regel 427 IS die regel met extern "C" erin ;)

[ Voor 9% gewijzigd door Verwijderd op 07-05-2004 09:08 ]


Verwijderd

Je zou met nm.exe kunnen kijken op welke manier jouw programma het symbool verwacht, en op welke manier je de library het symbool heeft gedefineerd. Dan zie je tenminste wat er fout gaat.

Heb je die zip library zelf helemaal gecompileerd of gebruik je een voorgebakken .lib? Welke compiler gebruik je trouwens?

(Als je nm.exe niet op je systeem hebt: je vind een voorgecompileerde versie in het MinGW pakket.)

[Edit: Ik zie al dat je een versie van Visual C++ gebruikt]

[ Voor 8% gewijzigd door Verwijderd op 07-05-2004 09:10 ]


Verwijderd

Topicstarter
de library is info-(un)zip. De library kan ik gewoon compilen via de infozip-project files. Maar ik wil liever de source in mijn project ipv via een .lib te includen ;) (dan kan ik gemakkelijker overstappen naar andere compilers indien dit moet zijn (lees overstappen naar MinGW)).

Ik gebruik Visual Studio 6 atm.

Verwijderd

Die fout betekend dat je extern "C" gebruikt in een .c file, en dat mag niet.

Je moet dus zoiets als dit in je decs.h zetten:
C++:
1
2
3
4
5
6
7
8
9
#ifdef __cplusplus
extern "C" {
#endif

int WINAPI Wiz_SingleEntryUnzip....

#ifdef __cplusplus
}
#endif

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Het equivalent van 'nm' is OBJDUMP. Stuur de output naar textfile, en vergelijk de definitie met het gebruik. Als de name mangling een probleem is, dan is dat vrij duidelijk in de dump. Je hebt dan twee verschillende namen met Wiz_SingleEntryUnzip erin.

Extern "C" is maar een mogelijkheid om een andere name mangling te krijgen.

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


Verwijderd

Topicstarter
H3ASO4 heeft gelijk...

Met dank H3 ;-)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 25-05 22:48

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 07 mei 2004 @ 10:02:
H3ASO4 heeft gelijk...

Met dank H3 ;-)
Like I said, de functie met extern "C" declareren ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Alles simpel houden voor deze belg hé Creepy ;)
Pagina: 1