Wat doen de makefile-symbolen $ @ en $ & lt; gemiddelde?

Wat doen de $@en $<doen precies?


1, Autoriteit 100%

$@is de naam van het doelwit dat wordt gegenereerd en $<de eerste vereiste (meestal een bronbestand). U kunt een lijst vinden van al deze speciale variabelen in de GNU MAAK handmatig .

Overweeg bijvoorbeeld de volgende aangifte:

all: library.cpp main.cpp

In dit geval:

  • $@Evalueert naar all
  • $<Evalueert naar library.cpp
  • $^Evalueert naar library.cpp main.cpp

2, Autoriteit 15%

van Beheer van projecten met GNU Merk, 3e editie, p. 16 (het staat onder GNU gratis documentatielicentie ):

Automatische variabelen worden ingesteld met makeNA EEN REGEL MAATSTE. Zij
Geef toegang tot elementen uit het doel en de vereiste lijsten dus
U hoeft geen bestandsnamen expliciet te specificeren. Ze zijn heel erg
Handig voor het vermijden van code-duplicatie, maar zijn kritisch bij het definiëren
meer algemene patroonregels.

Er zijn zeven “kern” automatische variabelen:

  • $@: de bestandsnaam die het doelwit vertegenwoordigt.

  • $%: het bestandsnaamelement van een specificatie van het archiefelement.

  • $<: de bestandsnaam van de eerste vereiste.

  • $?: de namen van alle vereisten die nieuwer zijn dan het doelwit,
    gescheiden door spaties.

  • $^: de bestandsnamen van alle vereisten, gescheiden door spaties. Dit
    list heeft dubbele bestandsnamen verwijderd omdat voor de meeste toepassingen, zoals:
    compileren, kopiëren, enz., duplicaten zijn niet gewenst.

  • $+: vergelijkbaar met $^, dit zijn de namen van alle vereisten gescheiden
    door spaties, behalve dat $+duplicaten bevat. Deze variabele was
    gemaakt voor specifieke situaties zoals argumenten voor linkers waarbij:
    dubbele waarden hebben betekenis.

  • $*: De stam van de doelbestandsnaam. Een stam is meestal een bestandsnaam
    zonder zijn achtervoegsel. Het gebruik ervan buiten patroonregels is:
    ontmoedigd.

Bovendien heeft elk van de bovenstaande variabelen twee varianten voor
compatibiliteit met andere merken. Eén variant retourneert alleen de directory
deel van de waarde. Dit wordt aangegeven door een “D” toe te voegen aan de
symbool, $(@D), $(<D), enz. De andere variant retourneert alleen het bestand
deel van de waarde. Dit wordt aangegeven door een “F” toe te voegen aan de
symbool, $(@F), $(<F), enz. Merk op dat deze variantnamen meer dan
één teken lang en moet dus tussen haakjes staan. GNU-merk
biedt een beter leesbaar alternatief met de dir en notdir
functies.


Antwoord 3, autoriteit 14%

De $@en $<worden automatische variabelengenoemd. De variabele $@staat voor de naam van het doel en $<staat voor de eerste vereiste die vereist is om het uitvoerbestand te maken.
Bijvoorbeeld:

hello.o: hello.c hello.h
         gcc -c $< -o $@

Hier, hello.ois het uitvoerbestand. Dit is wat $@uitbreidt naar. De eerste afhankelijkheid is hello.c. Dat is wat $<breidt uit naar.

De -cVlag genereert de .obestand; Zie man gccvoor een meer gedetailleerde uitleg. De -ogeeft het uitvoerbestand aan om te maken.

Voor meer informatie kunt u dit artikel over Linux-makeFiles lezen.

Ook kunt u de GNU makeHandleidingen . Het maakt het gemakkelijker om makeFiles te maken en om te debuggen.

Als u deze opdracht uitvoert, wordt de MAKEFILE-database uitgevoerd:

make -p 

4, Autoriteit 6%

De $@en $<zijn speciale macro’s.

Waar:

$@is de bestandsnaam van het doelwit.

$<is de naam van de eerste afhankelijkheid.


Antwoord 5

bijvoorbeeld als je bronnen wilt compileren maar objecten in een andere map hebt:

Je moet doen:

gcc -c -o <obj/1.o> <srcs/1.c> <obj/2.o> <srcs/2.c> ...

maar bij de meeste macro’s is het resultaat alle objecten gevolgd door alle bronnen, zoals:

gcc -c -o <all OBJ path> <all SRC path>

dus dit compileert niets ^^ en je kunt je objectbestanden niet in een andere map plaatsen 🙁

de oplossing is om deze speciale macro’s te gebruiken

$@ $<

dit genereert een .o-bestand (obj/file.o) voor elk .c-bestand in SRC (src/file.c)

$(OBJ):$(SRC)
   gcc -c -o $@ $< $(HEADERS) $(FLAGS)

het betekent:

   $@ = $(OBJ)
    $< = $(SRC)

maar regel voor regel IN PLAATS van alle regels van OBJ gevolgd door alle regels van SRC

Other episodes