[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

pl.comp.programming

Bledy linkera

azot16

7/17/2007 2:29:00 AM

Witam.

W projekcie VC 2005 mam plik *.h z funkcja globalna i dwie klasy A i B
(kazda po dwa pliki *.h i *.cpp).
W konstruktorze klasy A wywoluje moja funkcje globalna i wszystko jest
OK.

//------------------------------------------------
Plik <MyFun.h>
=========
#ifndef MY_FUN_FILE
#define MY_FUN_FILE

namespace MyFun
{
namespace Math
{
int MyFun_1() { return 0; }
}
}

#endif // MY_FUN_FILE
//------------------------------------------------

Plik <KlasaA.cpp>
=============
#include "KlasaA.h"
#include "MyFun.h"

KlasaA::KlasaA()
{
int_a = MyFun::Math::MyFun_1();
};
//------------------------------------------------

Gdy to samo próbuje zrobic w konstruktorze drugiej klasy B:

Plik <KlasaB.cpp>
=============
#include "KlasaB.h"
#include "MyFun.h"

KlasaB::KlasaB()
{
int_b = MyFun::Math::MyFun_1();
};
//------------------------------------------------

to dostaje blad linkera z komunikatem o tym, ze symbol
"MyFun::Math::MyFun_1" jest juz zdefiniowany w pliku KlasaA.obj (error
LNK2005: <...> already defined in KlasaA.obj). Rozumiem ten komunikat
i w zasadzie to wiem czemu ten blad wystepuje. Wiem tez jak sie pozbyc
tego bledu - wystarczy funkcje "MyFun_1" umiescic w pliku *.cpp a w
pliku *.h zostawic tylko jej naglówek. Jak jednak znalazlem inne
rozwiazanie - otóz "namespace Math" zamienilem na "class Math", a
funkcje "MyFun_1" zadeklarowalem jako statyczna i teraz mimo, ze
wszystko jest tak jak poprzednio w jednym pliku *.h to bledu juz nie
ma. Czy ktos wie czy to jest normalna sytuacja, czy jakis side-effect
VC 2005.

Podsumowujac: po zamianie powyzszego pliku MyFun.h na ponizszy blad
znika.

//----------------------------------------------------------------
Plik <MyFun.h> // Nowa wersja
=========
#ifndef MY_FUN_FILE
#define MY_FUN_FILE

namespace MyFun
{
class Math
{
public:
static int MyFun_1() { return 0; }
};
}

#endif // MY_FUN_FILE
//----------------------------------------------------------------

Zmienilem tylko zawartosc pliku "MyFun.h". Zwrot "namespace Math"
zamienilem na "class Math" oraz dodalem dwa slowa: public i static. I
teraz linker nie ma juz problemów i nie bardzo rozumiem dlaczego mial
je poprzednio.

Pytanie:

a) Czy to jest normalne zachowanie kazdego kompilatora-linkera C++?
b) Czy ktos wie dlaczego ten blad zniknal?

26 Answers

Marcin Gabryszewski

7/17/2007 6:11:00 AM

0

azot16 pisze:
> Witam.
>
> Zmienilem tylko zawartosc pliku "MyFun.h". Zwrot "namespace Math"
> zamienilem na "class Math" oraz dodalem dwa slowa: public i static. I
> teraz linker nie ma juz problemów i nie bardzo rozumiem dlaczego mial
> je poprzednio.
>
> Pytanie:
>
> a) Czy to jest normalne zachowanie kazdego kompilatora-linkera C++?
TAK

> b) Czy ktos wie dlaczego ten blad zniknal?
TAK.

Jakie pytania takie odpowiedzi :)



--
Regards,
Marcin Gabryszewski
G DATA Software Sp. z o.o.
www.gdata.pl

azot16

7/17/2007 3:48:00 PM

0

> > b) Czy ktos wie dlaczego ten blad zniknal?
> TAK.
>
> Marcin Gabryszewski
> G DATA Software Sp. z o.o.www.gdata.pl

Cwana odpowiedz podpisana z imienia i nazwiska - bardzo odwaznie. Nie
boisz sie, ze któregos dnia ludzie po prostu zaczna cie omijac?

My na studiach tez mielismy takiego jednego cwaniaka - gosc byl dobry
z przedmiotu X i bardzo sie cwaniaczyl. Ale jak to w zyciu bywa
przedmiot X sie w koncu skonczyl i gosc przestal byl potrzebny.
Niestety zle odium cwaniaka ciagnelo sie za nim do konca studiów i
raczej nie ulatwialo mu to zycia. Nam za to bardzo pomoglo, bo wszyscy
na wlasne oczy zobaczylismy, ze cwaniactwo na dluzsza mete sie nie
oplaca. Tak wiec ciesz sie póki mozesz, bo jak znam zycie to to sie
wkrótce zmieni.

PS. Podaj jeszcze adres i telefon to sobie zapisze.

Kamil Burzynski

7/17/2007 4:01:00 PM

0

On Mon, 16 Jul 2007 19:28:49 -0700
azot16 <azot16@o2.pl> wrote:

> a) Czy to jest normalne zachowanie kazdego kompilatora-linkera C++?
Tak.

> b) Czy ktos wie dlaczego ten blad zniknal?

Tak. ;)

Na tej grupie wciaz mamy wysyp niedoprecyzowanych pytan i innych prosb
o wrozenie z fusow. Stad, w celach edukacyjnych na pytanie 'czy ktos
wie..' bedziesz dostawal odpowiedzi bardzo precyzyjne (i zupelnie
nieprzydatne).

Zdaje sie, ze kompilator mial prawo zrobic twoja funkcje jako inline,
stad linker nic nie zauwazyl.

--
Best regards from
Kamil Burzynski

Jacek Czerwinski

7/17/2007 4:16:00 PM

0

Dnia Tue, 17 Jul 2007 08:48:14 -0700, azot16 napisa3(a):

>>> b) Czy kto? wie dlaczego ten b3?d znikn?3?
>> TAK.
>>
>> Marcin Gabryszewski
>> G DATA Software Sp. z o.o.www.gdata.pl
>
> Cwana odpowied? podpisana z imienia i nazwiska - bardzo odwa?nie. Nie
> boisz sie, ?e którego? dnia ludzie po prostu zaczn? cie omijaa?
>
> My na studiach te? mieli?my takiego jednego cwaniaka - go?a by3 dobry
> z przedmiotu X

Nie podejrzewam cie by? by3 róznie dobry i to twój "kompleks"?

(kompleks to podstawowe s3owo na grupie np. php, a co troskliwsi twoi
koledzy, którzy co? przeczytali, interesuj? sie sprawno?ai? seksualn?
korespondenta)

> i bardzo sie cwaniaczy3.
A nag3o?niej 3apaa z3odzieja wiesz kto krzyczy ...

pdemb

7/17/2007 5:09:00 PM

0

azot16 <azot16@o2.pl> writes:

>> > b) Czy kto? wie dlaczego ten b3?d znikn?3?
>> TAK.
>>
>> Marcin Gabryszewski
>> G DATA Software Sp. z o.o.www.gdata.pl
>
> Cwana odpowied? podpisana z imienia i nazwiska - bardzo
> odwa?nie. Nie boisz sie, ?e którego? dnia ludzie po prostu
> zaczn? cie omijaa?

*plonk*

Bogus

7/17/2007 8:56:00 PM

0

Dnia 17-07-2007 o 18:01:05 Kamil Burzynski <K.Burzynski@usunto.adbglobal.com> napisaÅ?(a):

[...]
> Zdaje sie, ze kompilator mial prawo zrobic twoja funkcje jako inline,
> stad linker nic nie zauwazyl.

To raczej na odwrót. Ta sama funkcja wystÄ?puje w dwóch jednostkach
translacji (dwa pliki cpp), wiÄ?c linker nie wie, którÄ? wybraÄ? (already
defined in KlasaA.obj).
No a jak zmienasz namespace'a na klasÄ?, to to już jest metoda, a nie
funkcja, wiÄ?c ma innÄ? sygnaturkÄ?.

Pozdrawiam

--
BoguÅ?
www.google.pl <-- to nie boli
http://bogu...

Marcin 'Qrczak' Kowalczyk

7/17/2007 9:41:00 PM

0

Dnia 17-07-2007, Wt o godzinie 22:56 +0200, franek napisal(a):
> Dnia 17-07-2007 o 18:01:05 Kamil Burzynski <K.Burzynski@usunto.adbglobal.com> napisal(a):
>
> [...]
> > Zdaje sie, ze kompilator mial prawo zrobic twoja funkcje jako inline,
> > stad linker nic nie zauwazyl.

To jest poprawne wyjasnienie.

> To raczej na odwrót. Ta sama funkcja wystepuje w dwóch jednostkach
> translacji (dwa pliki cpp), wiec linker nie wie, która wybrac (already
> defined in KlasaA.obj).
> No a jak zmienasz namespace'a na klase, to to juz jest metoda, a nie
> funkcja, wiec ma inna sygnaturke.

To jest bezsensowne gadanie, bo nie wyjasnia, dlaczego ta metoda moze
miec definicje w kilku jednostkach kompilacji.

--
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrnik.knm.org.p...

azot16

7/18/2007 8:06:00 PM

0

> Na tej grupie wciaz mamy wysyp niedoprecyzowanych pytan

Nie popadajmy w paranoje. Wyobraz sobie, ze jestes w miescie X i
szukasz np. dworca. Podchodzisz do kogos i pytasz sie "Czy pan wie
gdzie jest dworzec?", a on odpowiada "Tak" i odchodzi. Co o nim
pomyslisz? Ze to jakis super inteligentny gosc i ze musisz sobie
zrobic drugi fakultet zanim znów go o cos zapytasz? A teraz zmien
nieco sytuacje i zapytaj bezosobowo nie konkretna osobe ale grupe osób
- z wlasnej inicjatywy wychyla sie jeden gosc, rzuca odpowiedz "Tak" i
odchodzi, potem wychyla sie drugi i cos bredzi o kompleksach - czemu
maja sluzyc ich odpowiedzi? Moim zdaniem oni koniecznie chca blysnac w
dyskusji, mimo ze nie maja pojecia o danym zagadnieniu.

A co do pytania to precyzyjniej ujal Qrczak:

"Dlaczego ta metoda moze miec definicje w kilku jednostkach
kompilacji" w przypadku rozwiazania nr dwa, a nie moze w przypadku
rozwiazania nr jeden.

Inaczej rzecz ujmujac skoro kompilator w obydwu przypadkach nie ma
problemów z kompilacja to czym dla linkera rózni sie funkcja globalna
od funkcji statycznej danej klasy, ze nie moze zlinkowac projektu z
funkcja globalna, ale moze z funkcja statyczna klasy. Dodam jeszcze,
ze ta klasa nie miala zadnych instancji - byla tylko "opakowaniem" dla
wspomnianej funkcji.

Oczywiscie nie twierdze, ze cos jest "nie tak" z VC 2005 - po prostu
chce sie dowiedziec dlaczego tak jest.

azot16

7/18/2007 8:10:00 PM

0

> Nie podejrzewam cie bys byl róznie dobry i to twój "kompleks"?

Przedmiot X nikogo nie interesowal poza wspomniana osoba. Z reszta tej
osobie nie udalo sie ukonczyc studiów (w przeciwienstwie do
pozostalych), wiec nie pisz mi tu o kompleksach, bo nie znasz
"tematu".

Jesli ktos ma tu kompleks to raczej ty - miales "kiepski" dzien,
chciales "odreagowac" swoje kompleksy i wyslales mail-a "o niczym" na
pierwszy lepszy watek. Nie znasz goscia, a juz jestes po jego stronie
- czyzbys czul jakis zwiazek "duchowy" z osobami tego typu?

PS. Poczytaj dalszy ciag dyskusji i powiedz publicznie, ze wierzysz w
to iz pan M.G. zna odpowiedz na pytanie nr 2. Na pytanie nr 1 mozna
udzielic odpowiedzi "Nie" np. wtedy gdy sprawdzimy, ze na naszym
kompilatorze C++ nie ma tego problemu - na to wlasnie liczylem - ze
ktos kto sprawdzi, ze u niego jest inaczej odezwie sie i poda nazwe
kompilatora. Odpowiedz "Tak" to zwykle "bicie piany".

Bogus

7/18/2007 8:13:00 PM

0

Dnia 17-07-2007 o 23:41:19 Marcin 'Qrczak' Kowalczyk <qrczak@knm.org.pl> napisaÅ?(a):

> Dnia 17-07-2007, Wt o godzinie 22:56 +0200, franek napisaÅ?(a):
>> Dnia 17-07-2007 o 18:01:05 Kamil Burzynski <K.Burzynski@usunto.adbglobal.com> napisaÅ?(a):
>>
>> [...]
>> > Zdaje sie, ze kompilator mial prawo zrobic twoja funkcje jako inline,
>> > stad linker nic nie zauwazyl.
>
> To jest poprawne wyjaÅ?nienie.

W takim razie proszÄ? o Å?opatologiczne wyjaÅ?nienie, dlaczego miaÅ? prawo,
a nie zrobiÅ? (o czym Å?wiadczy komunikat already defined in KlasaA.obj).

Gdy do definicji funkcji dodaÅ?em inline, to owszem - byÅ?a inline i siÄ?
kompilowaÅ?o.

>> To raczej na odwrót. Ta sama funkcja wystÄ?puje w dwóch jednostkach
>> translacji (dwa pliki cpp), wiÄ?c linker nie wie, którÄ? wybraÄ? (already
>> defined in KlasaA.obj).
>> No a jak zmienasz namespace'a na klasÄ?, to to już jest metoda, a nie
>> funkcja, wiÄ?c ma innÄ? sygnaturkÄ?.
>
> To jest bezsensowne gadanie, bo nie wyjaÅ?nia, dlaczego ta metoda może
> mieÄ? definicje w kilku jednostkach kompilacji.
>

Metoda nie może mieÄ? definicji w kilku jednostkach kompilacji. Zmiana
namespace na class spowodowaÅ?a, że jedna z tych funkcji przestaÅ?a byÄ?
funkcjÄ?, a staÅ?a siÄ? metodÄ?.

--
BoguÅ?
www.google.pl <-- to nie boli
http://bogu...