Eu tenho um Makefile que contém uma install
seção que me permite fazer isso make install
depois de construir o código-fonte. A install
seção contém duas linhas de comandos shell:
install: /usr/local/lib
cp $(LIB_OBJ) $<
export LD_LIBRARY_PATH=$<
Portanto, a primeira linha copia libxxx.so para /usr/local/lib
e a segunda linha define a variável ambiental LD_LIBRARY_PATH
para /usr/local/lib
para que o executável final possa encontrar o arquivo libxxx.so.
Mas quando executo make install
a partir da linha de comando e digito:
echo $LD_LIBRARY_PATH
Ele mostra conteúdo vazio e não /usr/local/lib
conforme pretendido. Então, por que a segunda linha de comando no Makefile não é executada?
Responder1
make
quase certamente está executando ambas as linhas de comandos. No entanto, a linha export LD_LIBRARY_PATH=$<
(ou o que quer que make
a expanda) é executada por um shell que é um processo filho do make
processo. Ao digitar echo $LD_LIBRARY_PATH
, você obtém tudo o que a variável de ambiente LD_LIBRARY_PATH contém. Seu shell não executou a "exportação", um subprocesso de make
execução. Você terá que exportar em seu .bashrc
arquivo .zshrc
ou qualquer outro arquivo ou digitá-lo manualmente.
Responder2
Tentar:
export LD_LIBRARY_PATH := /usr/local/lib:$(LD_LIBRARY_PATH)
install:
#Do Install actions
VerSeção 5.3 do manual Makepara uma explicação da suposição correta de Bruce sobre subcamadas, o que nos leva aesta resposta no StackOverflow, que afirma que todos os comandos devem ser executados como um único liner.
Atualizar
Como o liner não funcionou, use o seguinte como exemplo (estou incluindo os arquivos abaixo para que o makefile final funcione):
Lista de arquivos:
hellomacke.c
#include
int main() {
// call a function in another file
myPrintHelloMake();
return(0);
}
oláfunc.c
#include
#include
void myPrintHelloMake(void) {
printf("Hello makefiles!\n");
return;
}
olámake.h
/*
example include file
*/
void myPrintHelloMake(void);
Fim da lista de arquivos
Makefile
IDIR =../include
CC=gcc
CFLAGS=-I$(IDIR)
ODIR=obj
LDIR =../lib
LIBS=-lm
_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = hellomake.o hellofunc.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
hellomake: $(OBJ)
gcc -o $@ $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean:
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
O makefile acima usa macros e expansão de strings para definir corretamente os diretórios de inclusão e bibliotecas sem a necessidade do export
comando. No seu caso, passar /usr/local/libs
e LDIR
compilar deve começar.
Referências
Colby College, Maine, Departamento de Ciência da Computação - Tutorial Makefile
O processador macro M4 - substituição de pasta