Tworzenie makefile - informacje podczas kompilacji

0

na początku wrzucę kod:

main.c

#include <stdio.h>
#include "add.h"

int main(void)
{
     int a=1;
     int b=2;
     printf ("a+b=%d\n",add(a,b));

    return 0;
}

add.h

#ifndef ADD_H
#define ADD_H
int add(int x, int y);
#endif 

add.c

int add(int x, int y){
	return (x+y);
} 

makefile.win

CC       = gcc
CFLAGS   = -Wall
OBJS     = add.o main.o 
add:$(OBJS)
	$(CC) -o add main.o add.c
main.o: main.c
	$(CC) -c main.c -o main.o
add.o: add.c
	$(CC) -c main.c -o add.o
clean:
	rm -rf *o add

podczas kompilacji (dev c++; windows) w logach kompilacji wyskakuje takie coś:

Kompilator: MinGW GCC 4.7.2 32-bit Release
Wykonywanie make...
mingw32-make.exe -f "Makefile.win" all
mingw32-make.exe: *** No rule to make target 'all'. Stop.

Compilation succeeded in 0,11 seconds

domyślam się, że czegoś brakuje w makefile'u, jakiegos parametru 'all' ale nie wiem co on robi i jak zmodyfikować to, żeby zadziałało.

pozdrawiam

0

Stwórz normalny projekt, DevC++ sam ci stworzy ten Makefile.win i to poprawnie.

0

wiem, specjalnie to wyłączyłem i próbowałem własny zrobić

generalnie jak czytałem tutaj http://lux.dmcs.p.lodz.pl/tk/make.html to make moze być "uniwersalny" czyli niezależnie od komputera będzie działać
dev używa np ścieżke do bibliotek (chyba)

"LIBS = -L"C:/Program Files/Dev-Cpp/MinGW32/lib" -L"C:/Program Files/Dev-Cpp/MinGW32/mingw32/lib" -static-libstdc++ -static-libgcc -std=c99"
może powinienem zacząć od pytania, czy da się to ominąć? tzn czy na windowsie tez mógłbym zrobić "uniwersalny" make, żeby na innym komputerze również będzie działać

0

Sprawdz czy w miejscach oznaczonych <TUTAJ> masz tabulator zamiast kilku spacji, bo mi w przypadku braku taba nie działa. Twój makefile u mnie zadziałał ale gdy właśnie ten szczegół sobie zmieniłem.

CC       = gcc
CFLAGS   = -Wall
OBJS     = add.o main.o 
add:$(OBJS)
<TUTAJ>$(CC) -o add main.o add.c
main.o: main.c
<TUTAJ>$(CC) -c main.c -o main.o
add.o: add.c
<TUTAJ>$(CC) -c main.c -o add.o
clean:
<TUTAJ>rm -rf *o add
0

czyli mi nie działa przez tego make.exe? jak to naprawić?:/

0

kolejna sprawa, że po zmianie na domyslny makefile program dalej nie działa, jest błąd:

main.c:(.text+0x2e): undefined reference to `add

1
$(CC) -o add main.o add.c

Nie do końca rozumiem że masz tu add.c a nie add.o

Ale tak poza tym wszystko bangla.

BTW make jest sprytny i wystarczyłoby ci:

CC       = gcc
CFLAGS   = -Wall
OBJS     = add.o main.o 
add:$(OBJS)
main.o: main.c
add.o: add.c
clean:
	rm -rf *o add
0

ok, dzięki

znalazłem też bład, dlaczego mi nie działał nawet przy domyślnym makefile - błąd w pliku add.h
zamiast

int add(int x, int y);

ma być

int add(int, int);

może komuś pomoże

@Edit jeszcze pytanie odnośnie sytuacji, gdy dołączam więcej niż 1 plik, czy make tak wygląda?

CC       = gcc
CFLAGS   = -Wall
OBJS     = add.o plik1.o plik2.o main.o 
add:$(OBJS)
main.o: main.c
add.o: add.c
plik1.o: plik2.c
plik1.o: plik2.c
clean:
    rm -rf *o add && rm -rf *o plik1 && rm -rf *o plik2

0

Bzdura. Może być i tak i tak. Nie ma absolutnie żadnego znaczenia. A kody które podałeś były poprawne bo je kompilowałem. No chyba że ty uzywasz jakiegoś gcc w wersji 0.9 beta to może...

Edit: Nie, nie powinien. Planujesz w ogóle kompilować same pojedyńcze pliki .o? Wątpię, więc po co ci te targety? o_O

0

Skopiowałem wszystko co podałeś do swoich plików i jedyny błąd jaki miałem (może wynikający z też, że kopiowałem bezpośrednio z forum) to kilka spacji zamiast tabulatora w miejscach o którym już pisałem wyżej. Po wstawieniu tam tabów wszystko działa jak należy.

1

No i tak też być powinno. Ale make jest sprytny i jak masz takie proste targety

plik1.o: plik1.c

to nie musisz ich pisać jeśli nie planujesz ich używać

0

niezbyt rozumiem

czyli mój make może wyglądać tak:

CC = gcc
CFLAGS = -Wall
OBJS = add.o plik1.o plik2.o main.o
add:$(OBJS)
plik2.o: cos_dodatkowego.h
clean:
rm -rf *o add

jeżeli nie dodaje nic dodatkowego to pomijam tą linijke? tą czyli xxx.o: xxx.c

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