2013-03-04 19 views
10

Z tego co wiem, ten błąd jest spowodowany przez niewłaściwe używanie osłon nagłówka, gdy masz wiele plików, w tym ten sam plik. W moim przypadku, to jest to drzewo, które jest przyczyną błędu:funkcja już zdefiniowana w .obj

File A includes Z, which contains the functions I need. File B includes A, and file C includes A.

bez żadnych #pragma once „s Program daje kilka odmian tego samego błędu:

blahblah.obj: error LNK2005: class some::namespace::ObjectType Object already 
    defined in dialogDlg.obj 

Właśnie zastanawiałem się, biorąc pod uwagę drzewa, które opisałem, jaki jest właściwy sposób, aby to właściwie skompilować?

Próbowałem użyć #pragma once na pliku Z, ale to nie zadziałało. Próbowałem też #pragma raz na pliku A, który również nie działał. W końcu próbowałem go zarówno na A, jak i Z, również nie działał.

+0

coś daje mi pomysł, że nie są z wykorzystaniem odrębnych plików nagłówkowych ?? –

Odpowiedz

12

Wygląda na to, że próbujesz zdefiniować zmienną w pliku nagłówkowym. Jeśli ten plik nagłówkowy jest zawarty w kilku plikach źródłowych, zostanie zdefiniowany w każdym pliku źródłowym, dając tym samym błąd.

Zamiast tego zadeklaruj jako extern, a następnie zdefiniuj w jednym ze swoich plików źródłowych.

Więc w pliku nagłówkowym:

extern ObjectType Object; 

A w pliku źródłowym:

ObjectType Object; 
+2

Dodam tylko, że nie ma to nic wspólnego z strażnikami. Uwzględnij osłony, aby zapobiec wielokrotnemu włączaniu tego samego nagłówka w jednym pliku źródłowym *. * Szukamy nagłówka powodującego problemy, dołączając go do * różnych * plików źródłowych. – Angew

+0

OK, więc jeśli potrzebuję dostępu do tych zmiennych i obiektów zarówno w pliku B, jak i pliku C (oba pliki .cpp), czy istnieje sposób na osiągnięcie tego w czysty sposób? – xcdemon05

+1

Tak długo jak kompilujesz b.cpp i c.cpp razem, to rozwiązanie już osiąga to, co chcesz. – us2012