У меня есть Makefile, который содержит install
раздел, позволяющий мне make install
после сборки исходного кода. install
Раздел содержит две строки команд оболочки:
install: /usr/local/lib
cp $(LIB_OBJ) $<
export LD_LIBRARY_PATH=$<
Итак, первая строка копирует libxxx.so в , /usr/local/lib
а вторая строка устанавливает переменную окружения LD_LIBRARY_PATH
в , /usr/local/lib
чтобы конечный исполняемый файл мог найти файл libxxx.so.
Но когда я запускаю make install
из командной строки и затем набираю:
echo $LD_LIBRARY_PATH
Он показывает пустой контент, а не /usr/local/lib
то, что задумано. Так почему же вторая строка команды в Makefile не выполняется?
решение1
make
почти наверняка выполняет обе строки команд. Однако строка export LD_LIBRARY_PATH=$<
(или то, что make
ее расширяет) выполняется оболочкой, которая является дочерним процессом процесса make
. Когда вы вводите echo $LD_LIBRARY_PATH
, вы получаете то, что было в переменной окружения LD_LIBRARY_PATH. Ваша оболочка не выполнила "экспорт", ее выполнил подпроцесс make
. Вам придется выполнить экспорт в вашем .bashrc
или .zshrc
или любом другом файле, или ввести его вручную.
решение2
Пытаться:
export LD_LIBRARY_PATH := /usr/local/lib:$(LD_LIBRARY_PATH)
install:
#Do Install actions
ВидетьРаздел 5.3 руководства по изготовлениюдля объяснения правильного предположения Брюса о подоболочках, которое приводит нас кэтот ответ на StackOverflow, в котором говорится, что все команды должны выполняться в одну строку.
Обновлять
Поскольку однострочный вариант не сработал, используйте в качестве примера следующее (я включаю файлы ниже, чтобы окончательный make-файл работал):
Список файлов:
hellomacke.c
#include
int main() {
// call a function in another file
myPrintHelloMake();
return(0);
}
hellofunc.c
#include
#include
void myPrintHelloMake(void) {
printf("Hello makefiles!\n");
return;
}
hellomake.h
/*
example include file
*/
void myPrintHelloMake(void);
Конец списка файлов
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)/*~
Вышеприведенный makefile использует макросы и расширение строк для правильной установки каталогов include и libraries без необходимости в export
команде. В вашем случае передача /usr/local/libs
и LDIR
последующая компиляция должны помочь вам начать.
Рекомендации
Колледж Колби, штат Мэн, факультет компьютерных наук — Учебное пособие по Makefile
Макропроцессор M4 — вставка-замена