Eu entendo que CFLAGS (ou CXXFLAGS para C ++) são para o compilador, enquanto CPPFLAGS é usado pelo pré-processador.
Mas ainda não entendo a diferença.
Preciso especificar um caminho de inclusão para um arquivo de cabeçalho que está incluído com #include - porque #include é uma diretiva de pré-processador, o pré-processador (CPPFLAGS) é a única coisa que me interessa?
Sob quais circunstâncias eu preciso fornecer ao compilador um caminho de inclusão extra?
Em geral, se o pré-processador encontra e inclui os arquivos de cabeçalho necessários, por que ele precisa ser informado sobre os diretórios de inclusão extras? Para que serve CFLAGS afinal?
(No meu caso, na verdade descobri que AMBOS permitem compilar meu programa, o que aumenta a confusão ... Posso usar CFLAGS OU CPPFLAGS para atingir meu objetivo (no contexto do autoconf pelo menos). O que dá?)
Respostas:
A regra implícita do make para compilar um programa C é
onde a
$()
sintaxe expande as variáveis. ComoCPPFLAGS
eCFLAGS
são usados na chamada do compilador, o que você usa para definir caminhos de inclusão é uma questão de gosto pessoal. Por exemplo, sefoo.c
é um arquivo no diretório atualambos chamarão seu compilador exatamente da mesma maneira, a saber
A diferença entre os dois entra em jogo quando você tem vários idiomas que precisam do mesmo caminho de inclusão, por exemplo, se você tiver
bar.cpp
, tenteentão as compilações serão
já que a regra implícita do C ++ também usa a
CPPFLAGS
variável.Essa diferença dá-lhe um guia bom para qual usar - se quiser que o pavilhão a ser utilizado para todos os idiomas colocá-lo em
CPPFLAGS
, se é para um idioma específico colocá-lo emCFLAGS
,CXXFLAGS
etc. Exemplos do último tipo incluem o cumprimento das normas ou bandeiras de aviso - você não gostaria de passar-std=c99
para o seu compilador C ++!Você pode então acabar com algo assim no seu makefile
fonte
cpp
usandoCPPFLAGS
e esperar qualquer resultado razoável porque-std=c99
afeta quais símbolos são definidos (especialmente em vez de macros de teste de recurso). Em vez disso, você precisa$(CC) $(CPPFLAGS) $(CFLAGS) -E
.A
CPPFLAGS
macro é usada para especificar#include
diretórios.Ambos
CPPFLAGS
eCFLAGS
trabalho no seu caso porque omake
(1) regra combina pré-processamento e compilação em um comando (para que ambos os macros são utilizados no comando).Você não precisa especificar
.
como um diretório de inclusão se usar o formulário#include "..."
. Você também não precisa especificar o diretório de inclusão do compilador padrão. Você precisa especificar todos os outros diretórios de inclusão.fonte
gcc -E
em um arquivo - não há #includes). A maioria dos compiladores modernos combina as etapas de pré-processamento e compilação, então você não precisa se preocupar com isso.Você está atrás de regras implícitas .
fonte
Para adicionar àqueles que mencionaram as regras implícitas, é melhor ver o que o make definiu implicitamente e para o seu ambiente usando:
Por exemplo:
que expande
Isso também imprimirá
# environment
dados. Aqui, você encontrará o caminho de inclusão do GCC, entre outras informações úteis.No make, quando se trata de pesquisar, os caminhos são muitos, a luz é uma ... ou algo nesse sentido.
C_INCLUDE_PATH
é todo o sistema, defini-lo em seus da Shell*.rc
.$(CPPFLAGS)
é para o caminho de inclusão do pré-processador.... ou ainda mais específico
make usa VPATH como um caminho de busca geral, então use com cautela. Se um arquivo existir em mais de um local listado no VPATH, o make tomará a primeira ocorrência na lista.
fonte