O que significa o símbolo% em Makefile?

6

Estou brincando com makefiles e me deparei com %. o ou %. c . Pelo que entendi, ele especifica todos os arquivos c ou o . Mas por que esse trabalho:

%.o: %.c
        $(CC) -c $^  -o $@  

e isso não funciona

SOURCE := $(wildcard *.c)

$(SOURCE:.c=.o): SOURCE
        $(CC) -c $^  -o $@

Ambas as expressões especificam todos os arquivos. Então, qual é o símbolo %. o: no make file?

    
por Mero 20.02.2017 / 15:50

2 respostas

6

Both expression specify all the files.

Não, a primeira regra informa make como obter um arquivo .o dado o arquivo .c correspondente. Observe o singular: um único arquivo.

A segunda regra (afirma) diz make como obter um monte de arquivos .o , dado outro monte de arquivos .c correspondentes. Observe o plural: todos os arquivos .c resultantes da *.c globbing.

Em uma nota lateral, %.o: %c é uma extensão do GNU.

Em outro lado, você não estará aprendendo como usar make no StackOverflow. Você deve considerar ler um livro.

    
por 20.02.2017 / 16:10
6

A construção:

%.o: %.c
        $(CC) -c $^  -o $@  

é uma regra padrão , que é um tipo da regra implícita. Ele especifica o um destino e um dependência e faz com que uma invocação de $(CC) para cada destino. Enquanto isso:

SOURCE := $(wildcard *.c)

$(SOURCE:.c=.o): SOURCE
        $(CC) -c $^  -o $@

é uma regra padrão, mas tem (possivelmente) muitos destinos e muitas dependências. Ainda assim, só invocará $(CC) uma vez.

    
por 20.02.2017 / 16:10

Tags

yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warning – yii\base\ErrorException

PHP Startup: Unable to load dynamic library 'memcached.so' (tried: /usr/lib/php/20190902/memcached.so (/usr/lib/php/20190902/memcached.so: undefined symbol: igbinary_serialize), /usr/lib/php/20190902/memcached.so.so (/usr/lib/php/20190902/memcached.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '784989',
    'url' => 'what-does-symbol-in-makefile-mean',
];

$_COOKIE = [
    'advanced-frontend' => '6tdte2jtcgjlk2jj2rc76vgl2m',
    '_csrf-frontend' => '2e743d12cc7c796677f3d8c55bbb6cea6f35f61f6fb4e365e5913d56877b2d17a:2:{i:0;s:14:"_csrf-frontend";i:1;s:32:"OzJ2oPUyowNtpvyQk5HC2xvBulZVVpEA";}',
];

$_SESSION = [
    '__flash' => [],
];