Avatar billede intel4004 Novice
22. april 2006 - 22:19 Der er 6 kommentarer og
1 løsning

Store problemer med LNK2005 fejl i Visual Studio 2005

Jeg sidder og roder med at bruge et eksperimentelt static library i C++ i Visual Studio 2005.

For at gøre forklaringen mere simpel vil jeg simplificere min situation:

Jeg har 4 filer:

* ex1.cpp
* ex2.cpp og ex2.h
* ex3.h

--- ex1.cpp:

#include <ex2.h>

int main() { return 0; }

--- ex2.c:

#include <ex2.h>

//definition af klasse metoder etc. (ikke vigtigt her)

--- ex2.h:

#include <ex3.h>

//et namespace og en klasse (ikke vigtigt er)

Problemet opstår ved include af ex3.h i ex2.h. Fil ex3.h er headeren til det eksperimentelle library. Jeg får generelt denne fejl (hvor foo() er flere forskellelige funktioner):

ex1.obj : error LNK2005: "public: bool __thiscall foo()" (?foo@blabla) already defined in ex2.obj

I dette tilfælde er bool __thiscall foo() defineret i det eksperimentelle library som jeg benytter igennem ex3.h. Siden ex1.c og ex2.c begge forsøger at inklude ex3.h går det åbenbart galt for linkeren (begge obj-filer indeholder det samme??).

1) Hvad kan jeg føre for at få dette til at virke. Fil ex3.h indeholder en klasse template - og librariet er i det hele taget template-baseret? Er dette årsagen til problemet?

Jeg er rimelig ny indenfor C++ men har en del erfaring med C. Det skal siges at det eksperimentelle library (ARToolKitPlus 2.0.2 vis nogen vil vide det) fungerer fint hvis ex3.h ikke forsøges brugt to steder.

Hjælp venligst :)

Mvh Ole Buus
Avatar billede intel4004 Novice
22. april 2006 - 22:21 #1
Hov - jeg roder lidt rundt i endelserne på filerne :) Endelsen .cpp forekommer på alle ikke-header filer.

Mvh Ole Buus
Avatar billede arne_v Ekspert
22. april 2006 - 22:23 #2
hvis du kun har erklæringer og ikke implementation i .H filerne og du aldrig
inkluderer en .C/.CPP fil i en anden .C/.CPP fil så burde du ikke få den fejl
Avatar billede intel4004 Novice
22. april 2006 - 22:42 #3
Jeg har ingen implementationer i .h filerne. Jeg kender godt til tricket med extern keyword for at få en variabel overført til andre c-filer (sådan forstår jeg tricket ihvertfald).

Men det er ikke tilfældet her. Fil ex3.h indeholder en klasse template. Men jeg er ikke engang begyndt at benytte denne klasse endnu. Det eneste jeg forsøger at gøre er at inkludere h. filen de korrekte steder først.

Har prøvet at /FORCE parametren til. Så bliver alle mine errors til warnings og jeg får istedet en enkel fatal error LNK1179:

MarkerTracker.obj : fatal error LNK1179: invalid or corrupt file: duplicate COMDAT '?logSettings@CameraAdvImpl@ARToolKitPlus@@UAEXPAVLogger@2@@Z'

Mvh Ole Buus
Avatar billede intel4004 Novice
22. april 2006 - 22:43 #4
MarkerTracker.obj er ex2.obj i eksemplet...
Avatar billede arne_v Ekspert
22. april 2006 - 22:45 #5
jeg er bange for at vi skal se et eksempel som kan recreate problemet for at
kunne hjælpe
Avatar billede intel4004 Novice
22. april 2006 - 23:29 #6
Jeg har gjort en kopi af min tilgængelig på min server (128kbps upstream):

url: http://hardbytes.dk/~exp_codetest

Filerne ligger i /src og /include. Additional include directory i brug lige nu er /extlib/artoolkitplus/include. Additional lib-dir er /extlib/artoolkitplus/lib, hvor jeg linker artoolkitplus.lib i Release build. Det er det eksperimentelle library jeg snakker om i spørsgmålet.

Jeg ved ikke hvor meget det hjælper dig til at hjælpe mig.

Måske kan du bedre fortæller mig helt præcis hvad LNK2005 fejlen betyder?

PS: Jeg svarer nok ikke mere iaften - er træt :)

Mvh Ole Buus
Avatar billede intel4004 Novice
23. april 2006 - 09:07 #7
arne_v>

Problemet er løst.

Jeg inkluderede faktisk implementations-kode to steder. Jeg er ikke så stærk i template-baseret kode.

Jeg fandt så udaf at der eksisterede en anden header-fil som ikke inkluderer implementationen men kun den nødvendige API. Sådan som det jo skal være :)

Men projektet compiler uden fejl nu. Tak for forsøget på at hjælpe.

Mvh Ole Buus
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