Avatar billede mikkeljans Nybegynder
07. april 2004 - 10:57 Der er 21 kommentarer og
1 løsning

Error LNK2001

Hvad vil det sige hvis jeg linker mit program og den giver fejlen:
error LNK2001: unresolved external symbol "public: static bool * Input::Keys" (?Keys@Input@@2PA_NA)
Avatar billede arne_v Ekspert
07. april 2004 - 11:38 #1
At den .obj fil der indeholder:

public: static bool * Input::Keys

metoden ikke er linket med.
Avatar billede jpk Nybegynder
07. april 2004 - 11:42 #2
Hvis det er et sæt .h/.cpp-filer du bruger direkte, skal du sørge for, at .cpp-filen er tilføjet til dit projekt.
Avatar billede mikkeljans Nybegynder
07. april 2004 - 12:21 #3
Alle filer er tilføjet til projectet...
Jeg lagde mærke til at alle fejlene kom ved statiske metoder.
Jeg har klasser som kun består af statiske felter og metoder.
Så jeg tænkte på om det ikke ville være smartere at bare gøre dem til functioner istedet for statiske medlemmer af en klasse?
Så jeg har prøvet at ændre på alle de klasser der har statiske medlemsdata til at de bare er functioner..
Men nu kommer en anden type fejl:
"error LNK2005: "bool Right" (?Right@@3_NA) already defined in main.obj"
Hvad betyder det?
Avatar billede jpk Nybegynder
07. april 2004 - 12:32 #4
Inkluderer du samme header flere gange?
I så fald er det en god ide at sætte ifdef's på headeren:

#ifndef MYHEADER_H
#define MYHEADER_H

class...

#endif
Avatar billede jpk Nybegynder
07. april 2004 - 12:33 #5
Prøv evt. også en "Rebuild All"
Avatar billede mikkeljans Nybegynder
07. april 2004 - 14:32 #6
Alle header filer er beskyttet mod at blive inkluderet 2 gange.
Rebuild all virker heller ikke..

Jeg forstår ikke helt hvordan der kan opstå fejl i Linking af obj filer.
Hvilke slags fejl er det linkeren opfanger som compileren ikke gør?
Man skulle ellers tro at hvis compileren havde sagt god for alt i koderne så burde den også kunne linkes fint.

Der er specialt 1 fejl som jeg syntes er meget mystisk:
"Input.obj : error LNK2005: "int SZ" (?SZ@@3HA) already defined in main.obj"

variablen SZ bliver defineret i headeren: Input.h
Den variabel bliver faktisk aldrig brugt på noget tidspunkt i hele programmet.. Men bliver kun defineret... Og den bliver heller aldrig tildelt nogen værdi nogen steder i programmet.
Avatar billede arne_v Ekspert
07. april 2004 - 14:37 #7
Det lyder som at du har:

int SZ;

i en .h fil som inkluderes i mere end 1 .c/.cpp fil.

Hvis det skal gøres helt rigtigt, så skal du have 1 fil med:

int SZ;

og resten af filerne med:

extern int SZ;

Men man kan vist også bare bruge den sidste i alle filerne.
Avatar billede arne_v Ekspert
07. april 2004 - 14:40 #8
Og der er ikke noget overraskende i at få linker fejl selvom noget compiler.

void foobar();

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

compiler fint. Du fortæller compileren at der er en funktion foobar og
den kalder du.

Men når der nu faktisk ikke er en funktion foobar så brokker linkeren sig.

Linkeren opdager ting som man har lovet er der men som ikek er der og
ting som er der 2 gange.
Avatar billede jpk Nybegynder
07. april 2004 - 14:40 #9
Virker det, hvis du omdøber variablen til noget andet?

(det kan være at en variabel med det navn allerede er defineret andetsteds)
Avatar billede mikkeljans Nybegynder
07. april 2004 - 15:17 #10
Input.h som indeholder int SZ bliver includeret flere gange fra forskellige .cpp filer..
Men jeg trode ikke den kunne includeres flere gange eftersom jeg har en:
#ifndef INPUT_H
#define INPUT_H
// Input Header kode
#endif

De data som ligger i Input.h skal bruges i flere forskellige .cpp filer.
Avatar billede arne_v Ekspert
07. april 2004 - 16:07 #11
De #ifndef etc. beskytter kun mod multiple inkluderinger i samme fil !
Avatar billede mikkeljans Nybegynder
07. april 2004 - 16:41 #12
Det er ikke muligt at beskytte sine header filer fra at blive inkluderet 2 gange i alle filer?
Avatar billede arne_v Ekspert
07. april 2004 - 16:44 #13
Nej, men det ville jo heller ikke være hensigtsmæssigt.

Du erklærer typer og globale variable med extern i en .h fil som inkluderes
i mange .c/.cpp filer så de kan bruge faciliteterne.

Du implementerer funktioner/metoder/variable i en .c/.cpp fil så de kun
implementeres en enkelt gang.
Avatar billede mikkeljans Nybegynder
07. april 2004 - 17:11 #14
Men hvis jeg nu har en header fil som indeholder nogen globale variabler og 2 .cpp filer som begge skal bruge de variabler.
Så bliver jeg jo nød til at inkludere header filen i begge .cpp filer.
Avatar billede arne_v Ekspert
07. april 2004 - 17:28 #15
Ja
Avatar billede arne_v Ekspert
07. april 2004 - 17:30 #16
Men du skal undgå at putte implementeringer i din header fil.
Avatar billede arne_v Ekspert
07. april 2004 - 17:30 #17
Jeg kan lave et eksempel senere i aften.
Avatar billede arne_v Ekspert
07. april 2004 - 22:51 #18
C:\>type z.h
int v = 0;

void foobar();
C:\>type z1.c
#include <stdio.h>

#include "z.h"

int main()
{
  foobar();
  printf("%d\n",v);
  return 0;
}

C:\>type z2.c
#include "z.h"

void foobar()
{
  v = 123;
}

C:\>cl z1.c z2.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x8
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

z1.c
z2.c
Generating Code...
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:z1.exe
z1.obj
z2.obj
z2.obj : error LNK2005: _v already defined in z1.obj
z1.exe : fatal error LNK1169: one or more multiply defined symbols found
Avatar billede arne_v Ekspert
07. april 2004 - 22:53 #19
C:\>type z.h
extern int v;

void foobar();
C:\>type z1.c
#include <stdio.h>

#include "z.h"

int main()
{
  foobar();
  printf("%d\n",v);
  return 0;
}

C:\>type z2.c
#include "z.h"

void foobar()
{
  v = 123;
}

C:\>cl z1.c z2.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

z1.c
z2.c
Generating Code...
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:z1.exe
z1.obj
z2.obj
z1.obj : error LNK2001: unresolved external symbol _v
z2.obj : error LNK2001: unresolved external symbol _v
z1.exe : fatal error LNK1120: 1 unresolved externals
Avatar billede arne_v Ekspert
07. april 2004 - 22:54 #20
C:\>type z.h
extern int v;

void foobar();
C:\>type z1.c
#include <stdio.h>

#include "z.h"

int v = 0;

int main()
{
  foobar();
  printf("%d\n",v);
  return 0;
}

C:\>type z2.c
#include "z.h"

void foobar()
{
  v = 123;
}

C:\>cl z1.c z2.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

z1.c
z2.c
Generating Code...
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:z1.exe
z1.obj
z2.obj

C:\>z1
123
Avatar billede mikkeljans Nybegynder
08. april 2004 - 13:36 #21
Det virker! Tak for hjælpen
Avatar billede arne_v Ekspert
08. april 2004 - 13:37 #22
Så ligger jeg et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester