[BCB6] Unresolved external

Pagina: 1
Acties:

  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 09-04 16:10
Ik plaats dit topic niet in SA aangezien hier de meeste gebruikers zitten naar ik aanneem.

Ik heb een project in Borland CBuilder 6 gemaakt en krijg bij het linken de bekende foutmelding 'Unresolved external ... referenced from ...'.
Nu weet ik zeker dat alle bestanden ge-add zijn en dat de functies zeker geimplementeerd zijn.

Het globale verloop van het project:

main.cpp (windows application):
C++:
1
2
3
4
5
6
7
8
9
10
11
...
#include "implfile.h"
...

... TfrmMain::Create(...)
{
    functie1();
    ...
    functie2();
    ...
}


implfile.h:
C:
1
2
3
4
...
void functie1();
void functie2();
...


implfile.c:
C:
1
2
3
4
5
6
7
#include "implfile.h"

void functie1()
{ ... }

void functie2()
{ ... }



Nu compileert alles wel - de .obj bestanden staan allemaal bij elkaar - maar de linker vindt de implementatie van de functies niet in implfile.obj.
Nu is mijn vraag of dit misschien aan de mixage van .c en .cpp bestanden kan liggen, of is er iets anders vaags aan de hand?

N.B.: Veel hits op GoT en Google, maar geen relevante. De prog-guru op de uni wist er ook geen raad mee (werkt zelf met VC).

[ Voor 5% gewijzigd door Limhes op 27-01-2004 21:39 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

tja, het is toch zo iets. Niet te zien met de stukjes code die je post. Kan je geen voorbeeldproject ergens uploaden?

We adore chaos because we like to restore order - M.C. Escher


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 09-04 16:10
LordLarry schreef op 27 januari 2004 @ 21:46:
tja, het is toch zo iets. Niet te zien met de stukjes code die je post. Kan je geen voorbeeldproject ergens uploaden?
Ik zal morgen een zipje uploaden, heb het nu niet bij de hand.

Trouwens, als ik in plaats van de .h files te includen de .c files include dan werkt het wel. Dit wil dus zeggen dat de implementatie correct is (zou ik zeggen), maar dat het puur de linker is die iets over het hoofd ziet (?).

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Limhes schreef op 27 januari 2004 @ 21:38:
Ik plaats dit topic niet in SA aangezien hier de meeste gebruikers zitten naar ik aanneem.
Linker errors horen ook echt in Programming & Webscripting thuis hoor :)
Ik heb een project in Borland CBuilder 6 gemaakt en krijg bij het linken de bekende foutmelding 'Unresolved external ... referenced from ...'.
En wat staat er vooral op de eerste puntjes want dat is nogal relevant...?

Professionele website nodig?


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 09-04 16:10
curry684 schreef op 27 januari 2004 @ 22:55:
En wat staat er vooral op de eerste puntjes want dat is nogal relevant...?
Er staan tig dezelfde van deze regels onder elkaar, voor elke functie die aangeroepen wordt eentje.

Op de eerste puntjes staat de functie die ik aanroep en op de tweede staat het .obj bestand van waaruit ik de functie aanroep:

Unresolved external 'functie1()' referenced from 'bladiebla\main.obj'

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

• Heb je de globale functies wel binnen dezelfde linkage convention gedeclareerd als geimplementeerd? Dwz. je hebt 'm niet toevallig extern "C" gedeclareerd of binnen een of ander eng pragma-blok.
• In je main.cpp declareer je functie1 en functie2 zonder returnvalue. Het is je bekend dat compilers dan een default returnvalue van 'int' invullen en je vervolgens warnings krijgt op "Unspecified return type: assuming int" en "Function should return a value"?

=[edit voor de volledigheid]=

Unresolved external 'functie1()' referenced from 'bladiebla\main.obj' impliceert een unmangled functienaam, oftewel eentje in extern "C" linkage conventions. Volgens mij heb je een klassiek probleem met dat je 1 functie op meerdere plekken anders declareert en afhankelijk van de scope al of niet de verkeerde aanroept.

[ Voor 29% gewijzigd door curry684 op 27-01-2004 23:22 ]

Professionele website nodig?


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 09-04 16:10
curry684 schreef op 27 januari 2004 @ 23:21:
• Heb je de globale functies wel binnen dezelfde linkage convention gedeclareerd als geimplementeerd? Dwz. je hebt 'm niet toevallig extern "C" gedeclareerd of binnen een of ander eng pragma-blok.
• In je main.cpp declareer je functie1 en functie2 zonder returnvalue. Het is je bekend dat compilers dan een default returnvalue van 'int' invullen en je vervolgens warnings krijgt op "Unspecified return type: assuming int" en "Function should return a value"?

=[edit voor de volledigheid]=

Unresolved external 'functie1()' referenced from 'bladiebla\main.obj' impliceert een unmangled functienaam, oftewel eentje in extern "C" linkage conventions. Volgens mij heb je een klassiek probleem met dat je 1 functie op meerdere plekken anders declareert en afhankelijk van de scope al of niet de verkeerde aanroept.
Volgens mij is er nog iets onduidelijk; ik declareer de functies niet nog eens in main.cpp, maar gebruik ze daar juist. De declaratie staat juist in de header. Enge pragma blokken gebruik ik ook niet :) en verder niets dan basic dingen, dus ook geen extern C enz.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Dan zal ik eens door je code moeten spitten, want met die excerpts uit je openingspost kan ik dan idd niet veel meer :)

Professionele website nodig?


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 09-04 16:10
curry684 schreef op 28 januari 2004 @ 00:25:
Dan zal ik eens door je code moeten spitten, want met die excerpts uit je openingspost kan ik dan idd niet veel meer :)
Zoals ik LordLarry al 'beloofd' had, zal ik morgen een zipje maken en dat uploaden. Ik vind 't namelijk ook een erg merkwaardig probleem en op de uni zag de 'helpdesk' het ook zo snel niet.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Laatste checkup: geen namespaces gebruikt ergens?

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Uhm het lijkt mij heel duidelijk hoor, functie1 en functie2 zijn gedefinieerd in een C sourcefile, en zijn dus C functies. Om die vanuit C++ aan te roepen moeten ze gedeclareerd zijn als met external "C" linkage. Bouw je headers dus zo op:

impfile.h:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef IMPFILE_H
#define IMPFILE_H

#ifdef __cplusplus
extern "C" {
#endif

/* al je declaraties hier */
void functie1 ();
void functie2 ();

#ifdef __cplusplus
}
#endif

#endif /* !defined (IMPFILE_H) */

[ Voor 3% gewijzigd door .oisyn op 28-01-2004 02:19 ]

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.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

.oisyn schreef op 28 januari 2004 @ 01:31:
Uhm het lijkt mij heel duidelijk hoor, functie1 en functie2 zijn gedefinieerd in een C sourcefile, en zijn dus C functies. Om die vanuit C++ aan te roepen moeten ze gedeclareerd zijn als met external "C" linkage. Bouw je headers dus zo op:
Omfg ik had de extensie van "implfile.c" niet gelezen. Dat wordt idd als C gecompileerd, en dus zit je zoals ik een stuk hierboven ook al aangaf idd met extern "C" linkage conventions.

Professionele website nodig?


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 09-04 16:10
.oisyn schreef op 28 januari 2004 @ 01:31:
Uhm het lijkt mij heel duidelijk hoor, functie1 en functie2 zijn gedefinieerd in een C sourcefile, en zijn dus C functies. Om die vanuit C++ aan te roepen moeten ze gedeclareerd zijn als met external "C" linkage. Bouw je headers dus zo op:

impfile.h:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef IMPFILE_H
#define IMPFILE_H

#ifdef __cplusplus
extern "C" {
#endif

/* al je declaraties hier */
void functie1 ();
void functie2 ();

#ifdef __cplusplus
}
#endif

#endif /* !defined (IMPFILE_H) */
Hulde! Inderdaad, dit lost alles op. Had al zo'n vermoeden dat de mixage tussen c en c++ wel degelijk iets uitmaakte, maar wist niet waar ik moest zoeken.

Bedankt :)
Pagina: 1