🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#15794
Author: Marcin O.
Date: Tue, 27 Feb 2007 07:40
35 lines
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
#15795
Author: Tomasz Bywalec
Date: Wed, 28 Feb 2007 10:34
39 lines
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
#15796
Author: Mariusz Lotko
Date: Wed, 28 Feb 2007 19:31
41 lines
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