Makefile make install은 여러 줄 명령을 실행하지 않습니다.

Makefile make install은 여러 줄 명령을 실행하지 않습니다.

소스 코드를 빌드한 후 작업을 수행 install할 수 있는 섹션이 포함된 Makefile이 있습니다 . make installinstall섹션에는 두 줄의 셸 명령이 포함되어 있습니다.

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 매크로 프로세서 - 페이스트 교체

관련 정보