소스 코드를 빌드한 후 작업을 수행 install
할 수 있는 섹션이 포함된 Makefile이 있습니다 . make install
이 install
섹션에는 두 줄의 셸 명령이 포함되어 있습니다.
install: /usr/local/lib
cp $(LIB_OBJ) $<
export LD_LIBRARY_PATH=$<
따라서 첫 번째 줄은 libxxx.so를 복사 하고 두 번째 줄은 최종 실행 파일이 libxxx.so 파일을 찾을 수 있도록 환경 /usr/local/lib
변수를 설정합니다 .LD_LIBRARY_PATH
/usr/local/lib
그러나 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 만들기서브쉘에 대한 Bruce의 올바른 가정을 설명하기 위해 다음을 얻습니다.StackOverflow에 대한 답변입니다., 이는 모든 명령이 한 줄로 실행되어야 함을 나타냅니다.
고쳐 쓰다
한 줄의 코드가 작동하지 않으므로 다음을 예로 사용하십시오(최종 메이크파일이 작동하도록 다음 파일을 포함합니다).
파일 목록:
안녕하세요 마크.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);
최종 파일 목록
파일 생성
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)/*~
위의 메이크파일은 매크로와 문자열 확장을 사용하여 명령 없이도 포함 및 라이브러리 디렉터리를 올바르게 설정합니다 export
. 귀하의 경우에는 전달한 /usr/local/libs
다음 LDIR
컴파일하는 것이 시작됩니다.
인용하다
메인 주 콜비 칼리지 컴퓨터 공학과 - Makefile Tutorial
M4 매크로 프로세서 - 페이스트 교체