fatal error LNK1169: one or more multiply defined symbols found

0

Hej,
Programuje już milion lat ale jakoś nie mogę zapamiętać jak takie problemy się rozwiązuje a są one strasznie czasochłonne i dobijające. A więc mam header i w nim zdefiniowane zmienne w namespace. No i taki header jest zlinkowany w milionach plików (oczywiście jest obarczony idfefem aby redefinicji nie było), no i niestety wywala błąd:
fatal error LNK1169: one or more multiply defined symbols found
Co ciekawe jak widać, nie wywala błędu dla zmiennych INFINITY i EPSILON. De facto te zmienne to stare zmienne, przed chwilą dodałem nowe i dla nich zaczął wywalać errory. Zrobiłem clean builda i to nie pomogło. Niestety nie pamiętam co takiego zrobiłem w przeszłości, że mi nie wywala dla INFINITY i EPSILONA. Za słaba pamięć mam, ale teraz obiecuje że zapisze sobie rozwiązanie.

#ifndef _CONST_
#define _CONST_
...
namespace d3d
{
	const float INFINITY = FLT_MAX;
	const float EPSILON = 1e-6f;//0.001f;
	bool depthBias = false; //is device support depth bias or not
	//const float DEPTHBIAS = -0.0005f;
	//const float SLOPESCALEDEPTHBIAS = 1.0f;
	D3DXMATRIX MatProj, MatProjZFight;
	bool chuj;
...
#endif

//1>engine3D.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProj" (?MatProj@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>engine3D.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProjZFight" (?MatProjZFight@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>gui.obj : error LNK2005: "bool d3d::c****" (?c****@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>gui.obj : error LNK2005: "bool d3d::depthBias" (?depthBias@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>gui.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProj" (?MatProj@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>gui.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProjZFight" (?MatProjZFight@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>human.obj : error LNK2005: "bool d3d::c****" (?c****@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>human.obj : error LNK2005: "bool d3d::depthBias" (?depthBias@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>human.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProj" (?MatProj@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>human.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProjZFight" (?MatProjZFight@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>light.obj : error LNK2005: "bool d3d::c****" (?c****@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>light.obj : error LNK2005: "bool d3d::depthBias" (?depthBias@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>light.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProj" (?MatProj@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>light.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProjZFight" (?MatProjZFight@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>main.obj : error LNK2005: "bool d3d::c****" (?c****@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>main.obj : error LNK2005: "bool d3d::depthBias" (?depthBias@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>main.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProj" (?MatProj@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>main.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProjZFight" (?MatProjZFight@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>object.obj : error LNK2005: "bool d3d::c****" (?c****@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>object.obj : error LNK2005: "bool d3d::depthBias" (?depthBias@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>object.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProj" (?MatProj@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>object.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProjZFight" (?MatProjZFight@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>psystem.obj : error LNK2005: "bool d3d::c****" (?c****@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>psystem.obj : error LNK2005: "bool d3d::depthBias" (?depthBias@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>psystem.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProj" (?MatProj@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>psystem.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProjZFight" (?MatProjZFight@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>shader.obj : error LNK2005: "bool d3d::c****" (?c****@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>shader.obj : error LNK2005: "bool d3d::depthBias" (?depthBias@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>shader.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProj" (?MatProj@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>shader.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProjZFight" (?MatProjZFight@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>sound.obj : error LNK2005: "bool d3d::c****" (?c****@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>sound.obj : error LNK2005: "bool d3d::depthBias" (?depthBias@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>sound.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProj" (?MatProj@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>sound.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProjZFight" (?MatProjZFight@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>sprite.obj : error LNK2005: "bool d3d::c****" (?c****@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>sprite.obj : error LNK2005: "bool d3d::depthBias" (?depthBias@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>sprite.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProj" (?MatProj@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>sprite.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProjZFight" (?MatProjZFight@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>swAnimation.obj : error LNK2005: "bool d3d::c****" (?c****@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>swAnimation.obj : error LNK2005: "bool d3d::depthBias" (?depthBias@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>swAnimation.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProj" (?MatProj@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>swAnimation.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProjZFight" (?MatProjZFight@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>terrain.obj : error LNK2005: "bool d3d::c****" (?c****@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>terrain.obj : error LNK2005: "bool d3d::depthBias" (?depthBias@d3d@@3_NA) already defined in allocMeshHierarchy.obj
1>terrain.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProj" (?MatProj@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
1>terrain.obj : error LNK2005: "struct D3DXMATRIX d3d::MatProjZFight" (?MatProjZFight@d3d@@3UD3DXMATRIX@@A) already defined in allocMeshHierarchy.obj
fatal error LNK1169: one or more multiply defined symbols found//

0

Wywaliłem wszystkie zmienne oprócz INFINITY i EPSILON i mi się kompiluje bez problemów. To ja tego kompletnie nie rozumiem czemu dla niektórych zmiennych wywala error a dla tych starych nie. Pewnie jakiś bug Visuala 2005. Moim zdaniem to zadanie nadaje się jak nic na mistrzostwa świata dla programistów (założenia to oczywiście brak zmiany designu), tylko trzeba dojść i zrobić tak aby dla nowych zmiennych też się kompilowało.

1
tomek_mm napisał(a):

ewnie jakiś bug Visuala 2005.

Tak, jasne, najlepiej od razu zwalić na system i kompilator...

tomek_mm napisał(a):

Moim zdaniem to zadanie nadaje się jak nic na mistrzostwa świata dla programistów (założenia to oczywiście brak zmiany designu), tylko trzeba dojść i zrobić tak aby dla nowych zmiennych też się kompilowało.

Moim zdaniem wątek nadaje się do Newbie, Ty zaś do reedukacji: nie definiuje się zmiennych w plikach nagłówkowych, powinny one zawierać jedynie DEKLARACJE... O prawidłowym wykorzystaniu plików nagłówkowych były dziesiątki wątków.

0
</quote> nie definiuje się zmiennych w plikach nagłówkowych, powinny one zawierać jedynie DEKLARACJE... O prawidłowym wykorzystaniu plików nagłówkowych były dziesiątki wątków.</quote>

Nie możesz wszystkiego do jednego worka wkładać. Akurat dla namespace jest inaczej. Nie da rady zdefiniowac zmiennej w cpp a dać deklarację w .h bo wywala komunikat o redefinicji podczas kompilacji.
1>error C2086: 'bool d3d::depthBias' : redefinition
1>see declaration of 'd3d::depthBias'

Póki co tymczasowe moje rozwiązanie to danie zmiennej jako const w pliku nagłówkowym bo dla nich zauważyłem że nie wywala errora linkowania. Jak chce ją zmodyfikowac taką zmienną to używam static_const. I w ten sposób mogę obejść buga. No ale fajnie by było znaleźc lepsze rozwiązanie.

0

Cholera, namespace'y (poza anonimowymi) absolutnie niczego nie zmieniają. To nie bug tylko Twoja nieznajomość podstaw języka...

0
PS napisał(a):

Cholera, namespace'y (poza anonimowymi) absolutnie niczego nie zmieniają. To nie bug tylko Twoja nieznajomość podstaw języka...

No to podaj kod do powyższego jak taki mądry jesteś. Jak programujesz jakieś proste rzeczy to wszystko się porkywa z teorią. Ale jak już przechodzisz do programowania skomplikowanych to sie okazuje że teoria mówi jedno a praktyka drugie. Jak chcesz to na solówkę się możemy umówić, bo w sumie nie lubię takich zarozumialców i wyjaśnić sprawę jak mężczyźni. Daj znać, pzdr Tomek

0

Jakby ktoś miał podobny problem to mała uwaga - oczywiście nie static_const (bo nie ma czegoś takiego), tylko const_cast, sorry wszystkim za pomyłkę ale już wieczór.:)

0

Wybacz, ale to Ty zamiast sięgnąć do literatury to się unosisz swoim ego i gadasz bzdury. Namespace tu nic nie zmienia. Ma to wyglądać tak:

//plik xxx.h
#pragma once
//zamiast tego mogą być standardowe strażniki(#ifndef...)
namespace whatever
{
    extern int a;
}

//plik xxx.cpp
#include "xxx.h"
int whatever::a = 10;

//main.cpp
//standardowe include'y
#include "xxx.h"
int main()
{
    std::cout << whatever::a << "\n";
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1