[linux] Re: Generieke regel voor executables in make

Cecil Westerhof CecilWesterhof op xs4all.nl
Ma Aug 23 22:13:39 CEST 2010


Op maandag 23 aug 2010 20:47 CEST schreef Marcel Nijenhof:

>> Ik ben aan het stoeien met make. Ik heb op het ogenblik de volgende
>> Makefile:
>> HELLO_WORLD_EXEC	= helloWorld
>> HELLO_WORLD_OBJECTS = helloWorld.o
>>
>> CXX             = g++
>
> Dit is een default onder linux!

Klopt, die kan weg.


>> CXXFLAGS        = -Wall -Wextra
>
> Voor deze flaggen weet ik inderdaad niet wat de defaults zijn.

Default is geen flags, dus dit is nodig.


>> $(HELLO_WORLD_EXEC): $(HELLO_WORLD_OBJECTS)
>> $(CXX) $(LDFLAGS) -o $(HELLO_WORLD_EXEC) $(HELLO_WORLD_OBJECTS)
>>
>> %.o: %.cpp $(GENERAL_HEADERS)
>> $(CXX) $(CXXFLAGS) -c $< -o $@
>>
>
> Dit zijn allemaal defaults!
>
> Voldoende is:
> $(HELLO_WORLD_EXEC): $(HELLO_WORLD_OBJECTS)

Nope, mijn versie doet:
    g++  -o helloWorld helloWorld.o
als ik het weglaat krijg je:
    cc   helloWorld.o   -o helloWorld
en dat gaat flink fout.
Ik zou natuurlijk op kunnen nemen:
    CC = g++
maar dat gaat fout op het moment dat er ook C-programma's moeten
worden gecompileerd. Dus ik houd het maar bij mijn versie. Ik heb hem
trouwens wel verbeterd, hij is nu:
    $(CXX) $(LDFLAGS) -o $@ $^
Ik kan nu bij alle link rules (wanneer er meerdere zijn), dezelfde
regel gebruiken, tenzij er een verschil is qua libaries.

Voor het bouwen van de object files is de rule niet nodig. Mijn versie
doet:
    g++ -Wall -Wextra -c helloWorld.cpp -o helloWorld.o
en geen rule doet:
    g++ -Wall -Wextra   -c -o helloWorld.o helloWorld.cpp
maar dat is functioneel natuurlijk gelijkwaardig.


> Note:
> Je mist op deze manier wel de dependencies van de header files.
> Maar daar zijn oplossingen voor.

Welke?


>> Op dit moment is het een beetje overkill, maar ik wil het zo generiek
>> mogelijk maken. In de toekomst wil ik met één Makefile meerdere
>> programma's maken.
>
> Je bereikt al een hoop door gewoon de default regels te gebruiken want
> die zijn generiek.

De Makefile is nu:
    HELLO_WORLD_EXEC	= helloWorld
    HELLO_WORLD_OBJECTS = helloWorld.o

    CXXFLAGS        = -Wall -Wextra
    EXECUTABLES     = $(HELLO_WORLD_EXEC)
    GENERAL_HEADERS = std_lib_facilities.h
    LDFLAGS         =
    OBJECTS			= $(HELLO_WORLD_OBJECTS)

    .PHONY: all

    all: $(EXECUTABLES)

    clean:
        rm -f $(EXECUTABLES) $(OBJECTS)

    $(HELLO_WORLD_EXEC): $(HELLO_WORLD_OBJECTS)
        $(CXX) $(LDFLAGS) -o $@ $^

-- 
Cecil Westerhof
Senior Software Engineer
LinkedIn: http://www.linkedin.com/in/cecilwesterhof



More information about the Linux mailing list