Thread View: pl.comp.objects
3 messages
3 total messages
Started by Marcin O.
Tue, 27 Feb 2007 07:40
Kompilacja warunkowa C++ pod VS2005
Author: Marcin O.
Date: Tue, 27 Feb 2007 07:40
Date: Tue, 27 Feb 2007 07:40
35 lines
1811 bytes
1811 bytes
Hej,
No chyba lamerskie pytanie, ale nie moge sobie poradzic :(
Tworze projekt pod VS2005 w C++, w ktorym chce zastosowac kompilacje
warunkowa.
Mam dwa pliki: naglowkowy 'a.h' i zrodlowy 'a.cpp'.
W pliku naglowkowym deklaruje funkcje A w postaci warunkowej:
#ifdef _A_
void A(void) ;
#endif
W pliki zrodlowy definiuje funkcje A rowniez w postaci warunkowej:
#ifdef _A_
void A(void) { return ; }
#endif
Teraz w pliku main.cpp chce uzyc funkcji A i robie to w ten sposob:
#define _A_
#include "a.h"
main()
{
A() ;
}
No i kicha. Mam blad linkera, ze nie widzi definicji funkcji A. Jak
sztucznie umiescze w pliku a.cpp na poczatku linijke #define _A_ to dziala,
ale jak usune to nie dziala. Wynika, ze dyrektywa #define _A_ ma zasieg
"lokalny" i dziala tylko na pliki naglowkowe a nie na pliki zrodlowe.
Czy tak jest? Jak moge zrobic by to dzialalo ok..
Pozdr
Marcin
Re: Kompilacja warunkowa C++ pod VS2005
Author: Tomasz Bywalec
Date: Wed, 28 Feb 2007 10:34
Date: Wed, 28 Feb 2007 10:34
39 lines
2709 bytes
2709 bytes
Marcin O. napisał(a): > [...] > > No i kicha. Mam blad linkera, ze nie widzi definicji funkcji A. Jak > sztucznie umiescze w pliku a.cpp na poczatku linijke #define _A_ to dziala, > ale jak usune to nie dziala. Wynika, ze dyrektywa #define _A_ ma zasieg > "lokalny" i dziala tylko na pliki naglowkowe a nie na pliki zrodlowe. > > Czy tak jest? Jak moge zrobic by to dzialalo ok.. > > Pozdr > Marcin > > Dokładnie tak jest - #define musi być widoczny nie tylko podczas kompilowania plików, w których korzystasz z funkcji A() (wtedy powoduje to, że pliki te "wiedzą", że dana funkcja istnieje) ale także podczas kompilowania pliku zawierającego jej definicję (tak, aby kompilator skompilował tę funkcję i umieścił ją w pliku .o lub .obj). W zasadzie wydaje mi się, że możesz usunąć #ifdef'a z pliku źródłowego funkcji A - tak aby ta funkcja zawsze się kompilowała. Linker chyba sam rozpozna czy dana funkcja jest rzeczywiście gdzieś używana czy nie i sam zdecyduje czy dołączyć ją do pliku wykonywalnego czy nie. Jeżeli dobrze kojarzę, tak potrafią robić "sprytniejsze" linkery - inne albo dołączają cały plik obiektowy albo nie dołączają go wogóle. Jeżeli w danym pliku masz zdefiniowaną tylko jedną funkcję to OK, ale jeśli jest ich tam kilka to linker dołączy je wszystkie nawet jeśli korzystasz tylko z jednej. Ale muszę *podkreślić* że nie jestem tego do końca pewien. Innym rozwiązaniem mogłoby być zrobienie jakiegoś pliku konfiguracyjnego (np. config.h) i umieszczenie w nim wszystkich #define'ów niezbędnych do skonfigurowania programu. Nagłówek ten include'owałbyś w odpowiednich plikach nagłówkowych i źródłowych. Pozdrawiam, Tomek Bywalec
Re: Kompilacja warunkowa C++ pod VS2005
Author: Mariusz Lotko
Date: Wed, 28 Feb 2007 19:31
Date: Wed, 28 Feb 2007 19:31
41 lines
2386 bytes
2386 bytes
Tomasz Bywalec wrote: > Marcin O. napisał(a): > > > [...] >> >> No i kicha. Mam blad linkera, ze nie widzi definicji funkcji A. Jak >> sztucznie umiescze w pliku a.cpp na poczatku linijke #define _A_ to >> dziala, ale jak usune to nie dziala. Wynika, ze dyrektywa #define _A_ ma >> zasieg "lokalny" i dziala tylko na pliki naglowkowe a nie na pliki >> zrodlowe. Działa na te pliki źródłowe, w których załączono plik nagłówkowy dyrektywą #include. > Dokładnie tak jest - #define musi być widoczny nie tylko podczas > kompilowania plików, w których korzystasz z funkcji A() (wtedy powoduje > to, że pliki te "wiedzą", że dana funkcja istnieje) ale także podczas > kompilowania pliku zawierającego jej definicję (tak, aby kompilator > skompilował tę funkcję i umieścił ją w pliku .o lub .obj). Dokładnie. > W zasadzie wydaje mi się, że możesz usunąć #ifdef'a z pliku źródłowego > funkcji A - tak aby ta funkcja zawsze się kompilowała. Linker chyba sam > rozpozna czy dana funkcja jest rzeczywiście gdzieś używana czy nie i sam > zdecyduje czy dołączyć ją do pliku wykonywalnego czy nie. (...) Linker może robić takie rzeczy, jeśli linkuje .o (lub .obj) do pliku wykonywalnego. W przeciwnym razie (linkowanie do biblioteki .a, .so lub .dll), nie ma gwarancji na poziomie linkowania, że dana funkcja jest nieużywana. Wyjątkiem są te, które w pliku źródłowym (.c lub .cpp) są zaznaczone słówkiem kluczowym static. Wówczas linker wie, że taka funkcja jest używana' tylko w ramach jednego pliku .o lub .obj. -- Mariusz Lotko
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads