Modyfikacja Makefile, tak aby kompilował programy z klasami z innego pliku

0

witam, chciałbym prosić o pomoc jak zmodyfikować plik Makefile aby kompilował programy z klasami jeżeli mam je w innym pliku. Jeżeli mam program jedno plikowy kompilacja przez make działa bez problemu. Gdy tworze programy i klasy w osobnych plikach to mam komunikat o błędzie undefined reference to

Window::Window(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, int)

Jeżeli kompiluje program bez użycia pliku Makefile to nie ma problemu. Niżej treść pliku Makefile:

CXX = clang++

INC= 

LIB= -lSDL2

CFLAGS = -Wall -Wextra -pedantic -g -std=c++14

SRCS = $(wildcard *.cpp)

PROGS = $(patsubst %.cpp,%,$(SRCS))

all: $(PROGS)

%: %.cpp
	$(CXX) $(CFLAGS) $(INC) $(LIB) -o $@ $<

.PHONY: clean

clean: 
	@echo usuwam gotowe pliki
	rm -f $(PROGS)
0

Musisz podać wszystkie pliki przy wywołaniu. Nazwy plików oddzielasz spacją.

0

Pytanie, a używasz Pan plików nagłówkowych?

0

plik makefile kompiluje bez problemu programy jedno plikowe i jest tak zrobione aby wszystkie z rozrzeżeniem cpp kompilował. mam problemy jeżeli mam klasy w osobnym pliku

0

Odpowiedz na pytanie. Masz nagłówki z deklaracjami tych klas?

0

tak

nalik napisał(a):

Odpowiedz na pytanie. Masz nagłówki z deklaracjami tych klas?

0

Ok. Pliki z klasmai kompilujesz z opcją -c, a potem wszytko linkujesz razem, tak?

0

bez tej opcji kompilowałem

0

To próbujesz skompilować każdy z tych plików jako wykonywalny. Opcja -c stworzy Ci pliki .o (object file), który nie musi posiadać wszystkich referencji do funkcji, potem możesz skonsolidować takie pliki w jedną binarkę, linker uzupełni brakujące referencje.

Inna opcja to podać do wywołania kompilatora wszystkie pliki źródłowe. Wtedy sam sobie poradzi.

0

dodałem opcje -c do CFLAGS, i mam taki kompunikat:

ksardas@ksardas-NC-V3-371-54TF:~/Dokumenty/programowanie/progGL$ make
clang++ -Wall -Wextra -pedantic -g -std=c++14 -c  -lSDL2 -o prog0002 prog0002.cpp
clang: warning: -lSDL2: 'linker' input unused [-Wunused-command-line-argument]
prog0002.cpp:3:14: warning: unused parameter 'argc' [-Wunused-parameter]
int main(int argc, char **argv)
             ^
prog0002.cpp:3:27: warning: unused parameter 'argv' [-Wunused-parameter]
int main(int argc, char **argv)
                          ^
2 warnings generated.
clang++ -Wall -Wextra -pedantic -g -std=c++14 -c  -lSDL2 -o prog0001 prog0001.cpp
clang: warning: -lSDL2: 'linker' input unused [-Wunused-command-line-argument]
prog0001.cpp:6:14: warning: unused parameter 'argc' [-Wunused-parameter]
int main(int argc, char **argv)
             ^
prog0001.cpp:6:27: warning: unused parameter 'argv' [-Wunused-parameter]
int main(int argc, char **argv)
                          ^
2 warnings generated.
clang++ -Wall -Wextra -pedantic -g -std=c++14 -c  -lSDL2 -o window window.cpp
clang: warning: -lSDL2: 'linker' input unused [-Wunused-command-line-argument]
nalik napisał(a):

To próbujesz skompilować każdy z tych plików jako wykonywalny. Opcja -c stworzy Ci pliki .o, które potem możesz skonsolidować w jedną binarkę.

Inna opcja to podać do wywołania kompilatora wszystkie pliki źródłowe. Wtedy sam sobie poradzi.

jak skonsolidować plik w jedną binarkę z użyciem Makefile którego utworzyłem??

CXX = clang++

INC= 

LIB= -lSDL2

CFLAGS = -Wall -Wextra -pedantic -g -std=c++14 -c

SRCS = $(wildcard *.cpp)

PROGS = $(patsubst %.cpp,%,$(SRCS))

all: $(PROGS)

%: %.cpp
	$(CXX) $(CFLAGS) $(INC) $(LIB) -o $@ $<

.PHONY: clean

clean: 
	@echo usuwam gotowe pliki
	rm -f $(PROGS)
0

Bo nadal nie skomsolidowałeś (zlinkowałeś) plików pośrednich.

0

jak mam to zrobić???

0

Próbowałeś może tak:
clang++ nazwa_pliku1 nazwa_pliku2 nazwa_pliku3 -o nazwa_binarki

0

ale jak zmodyfikować plik makefile: $(CXX) $(CFLAGS) $(INC) $(LIB) -o $@ $<

0

Dodać nowy target np. executable, zależny od skomilowanych plików klas, który przeprowadzi linkowanie :).

binary_name : $(PROGS)
  $(CXX) $(LIB) -o $@ $^

Jak chcesz by domyślnie budowało to uzależnij all od tej reguły, nie od PROGS.

PS.
Przy tak skonstruowanym pliku make zmiany w nagłówkach nie bedą powodowały kompilacji plików od nich zależnych.

0
nalik napisał(a):

Dodać nowy target np. executable, zależny od skomilowanych plików klas, który przeprowadzi linkowanie :).

binary_name : $(PROGS)
  $(CXX) $(LIB) -o $@ $^

Jak chcesz by domyślnie budowało to uzależnij all od tej reguły, nie od PROGS.

PS.
Przy tak skonstruowanym pliku make zmiany w nagłówkach nie bedą powodowały kompilacji plików od nich zależnych.

chcę aby z pomocą pliku Makefile skompilować kilka plików z funkcjami main(), mam taki komunikat:

ksardas@ksardas-NC-V3-371-54TF:~/Dokumenty/programowanie/progGL$ make exe
clang++ -lSDL2 -o exe prog0002 prog0001 window
prog0001: In function `main':
/home/ksardas/Dokumenty/programowanie/progGL/prog0001.cpp:6: multiple definition of `main'
prog0002:/home/ksardas/Dokumenty/programowanie/progGL/prog0002.cpp:4: first defined here
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Makefile:18: polecenia dla obiektu 'exe' nie powiodły się
make: *** [exe] Błąd 1

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