Toon posts:

[Win32/C++] error unresolved external symbol

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste tweakers,

ik ben bezig om een methode aan te spreken waarop ik de volgende error terug krijg:
error LNK2001: unresolved external symbol "enum SIPX_RESULT __cdecl sipxInitialize(void * *,int,int,int,int,int,char const *,char const *,bool,char const *,char const *,char const *)" (?sipxInitialize@@$$J0YA?AW4SIPX_RESULT@@PAPAXHHHHHPBD1_N111@Z)
D:\test projecten\test sip2\sip2\Debug\sip2.exe : fatal error LNK1120: 1 unresolved externals

de sourcode ziet er als volgt uit:

methode:
code:
1
2
3
4
5
6
7
8
9
10
11
12
SIPXTAPI_API SIPX_RESULT sipxInitialize(SIPX_INST* phInst,
            const int udpPort = DEFAULT_UDP_PORT,
            const int tcpPort = DEFAULT_TCP_PORT,
            const int tlsPort = DEFAULT_TLS_PORT,
            const int rtpPortStart = DEFAULT_RTP_START_PORT,
            const int maxConnections = DEFAULT_CONNECTIONS,
            const char* szIdentity = DEFAULT_IDENTITY,
            const char* szBindToAddr = DEFAULT_BIND_ADDRESS,
            bool      bUseSequentialPorts = false,
            const char* szTLSCertificateNickname = NULL,
            const char* szTLSCertificatePassword = NULL,
            const char* szDbLocation = NULL) ;

aansturing:
code:
1
2
3
4
5
SIPX_INST* phInst;
long result;
phInst = reinterpret_cast <SIPX_INST*> (11);
result = static_cast <SIPX_RESULT> (0);
result = sipxInitialize(phInst, 5060, 5060, -1, 5060);

op deze manier krijg ik dus de error unresolved external symbol. Wanneer ik deze als extern definieer krijg ik weer errors dat hij geen int kan casten naar SIPX_RESULT.

kortom ik krijg het niet voor elkaar om deze methode juist aan te spreken. Heel veel gegoogled en in de boeken gedoken maar het staat helaas te algemeen uitgelegd en heb ik te weinig ervaring :-)
het komt erop neer dat ik dus de methode verkeerd aanspreek waardoor er geen return waarde terugegeven kan worden.

Weet iemand wat ik verkeerd doe?

Alvast bedankt.

[ Voor 16% gewijzigd door Verwijderd op 02-03-2006 13:17 ]


  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 09-04 17:57

BoAC

Memento mori

Wil je je code tussen '[code]' tags zetten? Dat maakt het een stuk leesbaarder ;)

Als de implementatie van je functie in een C-library staat moet je de header-file zo:
code:
1
2
3
extern "C" {
    #include "headerfile.h"
}

includen ;)

Verwijderd

Topicstarter
bij deze :-)

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 17-12-2025

curry684

left part of the evil twins

Verwijderd schreef op donderdag 02 maart 2006 @ 13:05:
het komt erop neer dat ik dus de methode verkeerd aanspreek waardoor er geen return waarde terugegeven kan worden.
Nee hoor, het komt erop neer dat je de header goed hebt geinclude van die externe library, met de correcte declaratie voor die functie, en de functie goed aanroept (anders zou je een compiler error krijgen, geen linker error), maar je vergeet vervolgens de meegeleverde static library mee te linken.

Professionele website nodig?


  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 09-04 17:57

BoAC

Memento mori

Maar is het nu gelukt :?
curry684 schreef op donderdag 02 maart 2006 @ 13:36:
[...]

Nee hoor, het komt erop neer dat je de header goed hebt geinclude van die externe library, met de correcte declaratie voor die functie, en de functie goed aanroept (anders zou je een compiler error krijgen, geen linker error), maar je vergeet vervolgens de meegeleverde static library mee te linken.
* BoAC nam aan de hij de lib meelinkte ;)

[ Voor 4% gewijzigd door BoAC op 02-03-2006 14:01 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 17-12-2025

curry684

left part of the evil twins

BoAC schreef op donderdag 02 maart 2006 @ 13:59:
[...]

* BoAC nam aan de hij de lib meelinkte ;)
Dat neem ik bij voorbaat aan van niet als er staat "het staat helaas te algemeen uitgelegd en heb ik te weinig ervaring" ;)

Professionele website nodig?


Verwijderd

Topicstarter
hmm een library probleem zou heel goed kunnen. Wat ik heb begrepen van deze API is dat hij behoorlijk afhankelijk is van externe library's (reeds geinstalleerd).

Ik zal maandag er even verder naar kijken. Denk dat dat een hele goede kans van slagen heeft.

Ik hou jullie op de hoogte.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je moet ze niet alleen installeren, je moet de linker ook vertellen dat ie die libraries moet gebruiken.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
dit heb ik dus intussen goed naar gekeken en de fouten gecorrigeerd. Dezelfde error blijft echter staan helaas.

  • PoweRoy
  • Registratie: April 2002
  • Laatst online: 01:53

PoweRoy

funky!

-->Alles geschreven in visual studio c# .net maar project is c++ <--

hoewel het hier opgelost is ben ik op een soort gelijk probleem gestuit. Ik heb een header file voor een aansturing van een database (navision). Maar als ik die header wil inladen gaat t fout:
cplusplustest error LNK2001: unresolved external symbol "void (__cdecl* DBL_Str_2_Date)(unsigned long *,unsigned char *)" (?DBL_Str_2_Date@@3P6AXPAKPAE@ZA)

Lekker handig dus. De header is geschreven in C, met dit topic kwam ik tot de oplossing:
extern "C" #include "cf.h"
maar nu krijg ik de error:
cplusplustest error LNK2001: unresolved external symbol _DBL_Str_2_Date

veel weggeknipt en wat relevant leek laten staan
code:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*******************************************************************************
*   C/FRONT Database C-API Library Version W1 3.70.B
*******************************************************************************/
#ifndef _DBL_TYPE_H__
#define _DBL_TYPE_H__

#define DBL_VERSION                  32

#ifdef _MSC_VER
#define DBL_CDECL                    __cdecl
#else
#define DBL_CDECL                    _cdecl
#endif

#define DBL_EXPORT(type_)            type_ DBL_CDECL
#define DBL_EXPORTVA(type_)          type_ DBL_CDECL

<..sloopwerk...>

typedef unsigned char                DBL_U8;
typedef unsigned short int           DBL_U16;
typedef signed   short int           DBL_S16;
typedef unsigned long int            DBL_U32;
typedef signed long int              DBL_S32;
typedef signed long int              DBL_O32;
typedef double                       DBL_DOUBLE;

typedef DBL_U32                      DBL_BOOL;
typedef DBL_U32                      DBL_DATE;
typedef DBL_U32                      DBL_TIME;

typedef struct
{
  DBL_U8  Exp;
  DBL_U8  Mant[9];
  DBL_U8  Slack[2];
} DBL_BCD;

typedef struct
{
  DBL_U32 LowPart;
  DBL_S32 HighPart;
} DBL_S64;

typedef DBL_S64                     DBL_Duration;
typedef DBL_S64                     DBL_Datetime;

typedef struct
{
  DBL_U32 Data1;
  DBL_U16 Data2;
  DBL_U16 Data3;
  DBL_U8  Data4[8];
} DBL_GUID;

<..sloopwerk..>

#define DBL_Type_STR                 (45  * 0x100)
#define DBL_Type_DATE                (46  * 0x100)
#define DBL_Type_TIME                (46  * 0x100 + 1)
#define DBL_Type_BLOB                (132 * 0x100 + 2)
#define DBL_Type_BOOL                (133 * 0x100)
#define DBL_Type_S16                 (134 * 0x100)
#define DBL_Type_S32                 (135 * 0x100)
#define DBL_Type_U8                  (136 * 0x100)
#define DBL_Type_ALPHA               (137 * 0x100)
#define DBL_Type_O32                 (139 * 0x100)
#define DBL_Type_BCD                 (50  * 0x100)
#define DBL_Type_DATEFORMULA         (46  * 0x100 +22)
#define DBL_Type_S64                 (141 * 0x100)
#define DBL_Type_Duration            (144 * 0x100)
#define DBL_Type_Datetime            (146 * 0x100)
#define DBL_Type_GUID                (145 * 0x100)

<..sloopwerk..>

#ifndef _DBL_TD_H__
#define _DBL_TD_H__

void    DBL_Exit(void);
DBL_S32 DBL_Init(void);
void    SessionInit(DBL_U8 *DLLNAME);

#ifdef NDBC 
#define DLLNAME                        ((DBL_U8*)"cfrontsql")
#else
#define DLLNAME                        ((DBL_U8*)"cfront")
#endif

<..nog meer sloopwerk..>

typedef void      (DBL_CDECL *tDBL_Str_2_Date)(DBL_DATE *Date, DBL_U8 *Str);
typedef void      (DBL_CDECL *tDBL_Date_2_Str)(DBL_U8 *Str, DBL_S16 StrSize, DBL_DATE Date);

<..knipperdeknip..>

extern tDBL_Str_2_Date                   DBL_Str_2_Date                   ;
extern tDBL_Date_2_Str                   DBL_Date_2_Str                   ;

<..knip..>
#endif


en zo roep ik t aan (beetje rommelig omdat ik vanalles aan t proberen was)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
extern "C" {
    #include "cf.h"
}

int _tmain(int argc, _TCHAR* argv[])
{   
    DBL_U8 Str2[50];
    DBL_DATE cDate;
    
    printf ("Geef getal: ");
    scanf ("%s",Str2);
    printf("\n");
    printf("ingegeven getal: %s\n",Str2);
    
    DBL_Str_2_Date(&cDate,(DBL_U8*)"07-06-96");
    getchar();
    printf("%s",Str2);
    
    getchar();
    r

wat vergeet ik nu?
in devc++ doe ik het zonder de extern en het werkt wel :S

[ Voor 4% gewijzigd door PoweRoy op 06-03-2006 11:12 ]

[This space is for rent]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 17-12-2025

curry684

left part of the evil twins

PoweRoy schreef op maandag 06 maart 2006 @ 09:47:
-->Alles geschreven in visual studio c# .net <--

hoewel het hier opgelost is ben ik op een soort gelijk probleem gestuit. Ik heb een header file voor een aansturing van een database (navision). Maar als ik die header wil inladen gaat t fout:
cplusplustest error LNK2001: unresolved external symbol "void (__cdecl* DBL_Str_2_Date)(unsigned long *,unsigned char *)" (?DBL_Str_2_Date@@3P6AXPAKPAE@ZA)

Lekker handig dus. De header is geschreven in C, met dit topic kwam ik tot de oplossing:
extern "C" #include "cf.h"
maar nu krijg ik de error:
cplusplustest error LNK2001: unresolved external symbol _DBL_Str_2_Date
Dat is dezelfde error. In het eerste geval wordt de name C++-style gemangled tot DBL_Str_2_Date@@3P6AXPAKPAE@ZA, en in het 2e geval gebruik je C-style includes waardoor de naam niet gemangled wordt. De error is dus exact hetzelfde, en zegt nog steeds dat je die functie niet hebt meegelinkt.

Voor jullie allebei geldt: je code tonen als je een linker error hebt is nutteloos. Ik zal met een kort voorbeeld illustreren:
C++:
1
2
3
4
5
6
7
void MijnFunctie();

int main()
{
  MijnFunctie();
  return 0;
}

Als je dit wil builden krijg je een linker error op dat de functie "MijnFunctie" niet bestaat. Dat klopt, want ondanks dat dit syntactisch perfect goede C/C++ is, declareren we in deze code dat die functie bestaat, maar implementeren we hem nergens. Wat we dus moeten doen is de functie implementeren in deze code, of een externe library of object file meelinken die de code bevat voor die functie. Anders kan ie geen executable bouwen oftewel linken.

Onthoudt de algemene vuistregels:
• Compiler error = syntactisch probleem
• Linker error = missende implementatie
• Runtime error = logica probleem
PoweRoy schreef op maandag 06 maart 2006 @ 09:47:
in devc++ doe ik het zonder de extern en het werkt wel :S
Dan moet je in VC++ dezelfde objects en libraries meelinken als in devc++, dan werkt het daar ook perfect ;)

[ Voor 7% gewijzigd door curry684 op 06-03-2006 10:53 ]

Professionele website nodig?


Verwijderd

Topicstarter
Naar aanleiding van mij vorrige toppic over de error dat de compiler de externals niet kan vinden heb ik mijzelf wat verder verdiept in deze errors omdat ik deze eroor nog steeds niet heb kunnen oplossen.

Wat is het preciese probleem: Wanneer ik een functie probeer aan te roepen krijg ik steeds dit soort errors terug:

Linking...
Form1.obj : error LNK2001: unresolved external symbol "public: static enum OsStatus __cdecl OsSysLog::setOutputFile(int,char const *)" (?setOutputFile@OsSysLog@@$$FSA?AW4OsStatus@@HPBD@Z)
Form1.obj : error LNK2001: unresolved external symbol "public: static enum OsStatus __cdecl OsSysLog::initialize(int,char const *,int)" (?initialize@OsSysLog@@$$FSA?AW4OsStatus@@HPBDH@Z)
D:\test projecten\test sip2\sip3\Debug\sip3.exe : fatal error LNK1120: 2 unresolved externals

Na mijn research kwam ik op de volgende mogelijke oorzaken:
1) files niet goed geinclude (uitleg na zoeken op google)
2) Libary's niet goed toegevoegd in visial studio (uitkomst vorrige toppic)
3) /gs switch staat aan en daardoor kan het zijn dat de code een buffer overrun veroorzaakt.

mijn vraag is: zijn er meerdere mogelijkheden waardoor dit soort error's veroorzaakt kunnen worden? Ik heb hier last van met verschillende methodes dus ik doe iets grondig niet goed zeg maar.

Alvast bedankt voor jullie hulp

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 22:08
Oorzaak 3 kan niet, /GS levert een runtime error op en geen link-time. Oorzaak 1 is extreem onwaarschijnlijk, zeker als ik naar de daadwerkelijke symbols kijk (geen templates, en twee uit dezeflde class). Kortom, waarom twijfel je aan de uitkomst van het eerdere topic?

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


  • Rowwan
  • Registratie: November 2000
  • Laatst online: 18:15
Zie punt 2... Heb je je libraries nu al toegevoegd? Ik kan dit nergens terugvinden...

  • PoweRoy
  • Registratie: April 2002
  • Laatst online: 01:53

PoweRoy

funky!

niet alleen meelinken maar ook de libary laden met LoadLibary("<naam>"); ?

[This space is for rent]


  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 01:32

Gonadan

Admin Beeld & Geluid, Harde Waren
PoweRoy schreef op donderdag 09 maart 2006 @ 08:50:
niet alleen meelinken maar ook de libary laden met LoadLibary("<naam>"); ?
Dat is alleen nodig als je de functies dynamisch met GetProcAddress wilt oproepen.

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Verwijderd

Topicstarter
ik twijvel de uitkomst uit de eerdere topic niet, tis meer dat ik het gewoon niet goed begrijp door mijn weinige visual c++ ervaring (helpt wel het zoeken en klooien :-) ).

MSalters: Ik twijvel niet aan de eerdere uitkomst. Ik begrijp het gewoon niet :-)

Rowwan: Ja ik heb naar mijn inzicht alle nodige library's toegevoegd aan mijn project. Tools-options-Projects en bij de library's het nodige toegevoegd.

PoweRoy: Is dit niet hetzelfde als ik hierboven heb geschreven?

Komt er gewoon op neer dat ik niet weet hoe externals werken. MSDN en google geven daar wel mogelijk oorzaken voor maar natuurlijk niet precies de info die ik zoek.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 22:08
PoweRoy haalt ook link time en run time door elkaar.

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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik moet zeggen dat ik het een beetje nutteloos vind om een nieuw topic te openen over exact hetzelfde onderwerp met exact dezelfde foutmelding. Ik verplaats de berichten dan ook naar je andere topic :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • PoweRoy
  • Registratie: April 2002
  • Laatst online: 01:53

PoweRoy

funky!

ik kreeg zo'n zelfde soort error en dit had ik opgelost doormiddel van een voor gedefineere functie in een .c file.

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static DBL_S32 DBL_LoadModule()
{
  if (hGlobalSession->DLLLoaded)
    DBL_FreeModule();
  
  hGlobalSession->DLLHandle = (DBL_DLLHandleType*)LoadLibrary((char const*)hGlobalSession->DLLName);
  
  if (hGlobalSession->DLLHandle)
  {
    hGlobalSession->DLLLoaded = 1;
    return 0;
  }  
  
  return GetLastError();
}


leek me relevant maar was het blijkbaar dus niet :P ik ga es zoeken over runtime en loadtime laden van dll's

[This space is for rent]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 17-12-2025

curry684

left part of the evil twins

Verwijderd schreef op donderdag 09 maart 2006 @ 09:31:
Komt er gewoon op neer dat ik niet weet hoe externals werken. MSDN en google geven daar wel mogelijk oorzaken voor maar natuurlijk niet precies de info die ik zoek.
Welk gedeelte van [rml]curry684 in "[ Win32/C++] error unresolved external sy..."[/rml] was niet duidelijk? Erg veel duidelijker dan dat kan ik het niet uitleggen hoor.

Als je een functie aanroept, moet ie ergens geimplementeerd worden. Anders klaagt de linker. Simple as that.

@ PoweRoy: zoek eerst even het verschil op tussen static linked libraries en dynamic link libraries op, we hebben het hier over static linking ;)

[ Voor 12% gewijzigd door curry684 op 10-03-2006 13:37 ]

Professionele website nodig?

Pagina: 1