system makefile'ów

0

Witam
W pracy mamy projekt który dzieli się na komponenty i jest dość skomplikowany system makefile'ów tzn. jest jeden główny makefile który wywołuje z konsoli i który uruchamia budowanie poszczególnych komponentów:

komponent A:
	cd sciezka_do_komponentuA && $(MAKE) TGT=$(TARGET)
komponent B:
	cd sciezka_do_komponentuB && $(MAKE) TGT=$(TARGET)
...
itp.

Makefile każdego z komponentów może zawierac różne flagi, definy.
I żeby było wesoło to header klasy może mieścić się w komponencie A (interfejsy) a jego implementacja (plik .cpp) w komponencie B.
I teraz w komponencie C chcemy użyć obiektu takiej klasy i robimy

plik .cpp w komponencie C:
#include <sciezka do komponentu A w ktorym to miesci się header>

No i kompilator wywala mi się na etapie linkowania pliku w komponencie C: "undefined reference". Jak wywalę plik z komponentu B i w headerze komponentu A zrobie implementację (czy po prostu przeniose plik .cpp do komponentu A) to się linkuje, nie ma problemu. Czy ktoś wie może jak to rozwiązać? Przeniesienie .cpp do komponentu A nie wchodzi w grę. Jakoś da się może jakimiś parametrami w makefilu opędzlować to?

0

Przełącznikiem do kompilatora. Nie wiem jaki masz ale np. dla gcc to będzie -I (minus iiii) ze wskazaniem katalogu gdzie szukać plików nagłówkowych

0

Tylko że przy linkowaniu pliku z komponentu C kompilator nie ma problemu z wyszukaniem headera z komponentu A. Znajduje go. Tylko nie widzi wtedy pliku .o ani libki z komponentu B. To co to zrobić? De facto dla tego komponentu A nie ma nawet mejka robionego bo tam sa tylko headery. Czyli mamy:

komponent A:
    cd sciezka_do_komponentuA && $(MAKE) TGT=$(TARGET)
komponent B:
    cd sciezka_do_komponentuB && $(MAKE) TGT=$(TARGET)
komponent C:
    cd sciezka_do_komponentuC && $(MAKE) TGT=$(TARGET)
0

Czyli przy kompilacji komponentu C trzeba by jakoś dodać do makefile C bądź w linii z "make" gdzie szukac plików .o lub libek z komponentu B. Ale nie wiem jak to mu przekazać.

0

Komponent B powinien się budować do jakiejś libki i wtedy przy budowaniu C dajesz -l (elka) z nazwą tej libki: http://www.rapidtables.com/code/linux/gcc/gcc-l.htm

0

W makefile C musisz dorzucić zależność od B, coś w stylu:

CXXFLAGS = -Ltutaj_wrzuć_ściężkę_do_B.a/so/prx/wtf
LIBS = -lB

all:
    $(CXX) $(CXXFILES) $(LIBS) $(CXXFLAGS)
0

Niestety po 3 godzinnych próbach nie udaje mi się załatać problemu. Generalnie w tym projekcie nie buduje się przez gcc .. $(CXX) tylko przez $(MAKE) a on już ma ustawione odpowiednimi flagami z jakiego kompilatora korzystać na jaki target tylko że i tak to jest gcc. Co musze zrobić to zmodyfikowac tą linię do budowania albo kontent komponentC.mak. Oryginalnie linia do budowania wygląda tak.

$(MAKE) $(MFLAGS) -f $(USER_ROOT)/$(SYS_COMP)/komponentC.mak COMPONENT_NAME=KOMPONENT_C

Więc wrzuciłem dla uproszczenia libke komponentu B do odpowiedniego miejsca i wykonuję:

$(MAKE) -l$(USER_ROOT)/$(SYS_COMP)/libkaKomponentuB.a $(MFLAGS) -f $(USER_ROOT)/$(SYS_COMP)/komponentC.mak COMPONENT_NAME=KOMPONENT_C

ale sie nie buduje, dalej "undefined reference". Próbowałem też coś działać w komponentC.mak zgodnie z powyższymi wytycznymi ale bez efektów. W pliku komponentC.mak jest:

COMPONENT_SRC_DIR         += tutaj dodajemy foldery z headerami z ktorych korzysta komponentC
CFLAGS                     +=  to jest puste
CXXFLAGS                   += to jest puste, dodawałem -l$(USER_ROOT)/$(SYS_COMP)/libkaKomponentuB.a ale nie działało, też próbowałem podawac w inny sposób ścieżke nie przez zmienne
DEFINE                     += puste
CPP_SRC_FILES += tutaj dodaje sie .cpp z komponentuC do budowania
include innyMake w ktorym są ustawione rozne zmienne jak np.
        TGT_OUTPUT_OBJ_DIR = obj, podejrzewam że też moze wybor kompilatora
ale nie ma już tam libek dodawanych
0

już nieaktualne, tam gdzieś w projekcie w pliku tekstowym na sztywno wpisuje sie zbiór bibliotek od których kompilacja zależy, czyli mamy plik tekstowy z dzisiątkami linii -lLibka itd. Dodałem moje i nie ma problemu.

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