시스템 경로에 설치할 때 공유 라이브러리를 어떻게 설치합니까?

시스템 경로에 설치할 때 공유 라이브러리를 어떻게 설치합니까?

다음은 첫 번째 Makefile시도 입니다 .libsgtk.soMakefile

CFLAGS= -pthread \
       -I/usr/include/gtk-3.0 \
       -I/usr/include/pango-1.0 \
       -I/usr/include/atk-1.0 \
       -I/usr/include/cairo \
       -I/usr/include/gdk-pixbuf-2.0 \
       -I/usr/include/glib-2.0 \
       -I/usr/lib/x86_64-linux-gnu/glib-2.0/include

all: libsgtk.so

libsgtk.so: window.o
    gcc -shared -o libsgtk.so window.o

window.o: window.c
    gcc $(CFLAGS) -c -fpic window.c

clean:
     rm window.o

install:
    mv libsgtk.so /usr/local/lib

보시다시피 설치 경로를 /usr/local/lib. 경로에 같은 이름의 라이브러리가 이미 존재하면 어떻게 되나요? Makefile에서 이를 확인해야 합니까, 아니면 대체 설치 경로를 제공하기 위해 다른 도구를 사용해야 합니까?

답변1

변수를 사용해야 한다고 생각합니다. 예를 들어:

DESTDIR?=/usr/local/lib
...
install:
  mv libsgtk.so ${DESTDIR}

이 경우 사용자는 make DESTDIR=/usr/lib( ?위 참고)을 사용하여 기본값을 무시할 수 있습니다.

원하는 경우 테스트할 수 있습니다. 어쩌면 이것은 그다지 나쁜 생각이 아닐 수도 있습니다. 더 쉬운 방법은 mv -n(또는 mv -nv)을 대신 사용하는 것입니다 mv. 기존 파일을 덮어쓰지 않습니다. 가장 큰 단점은 반환 값이 mv0이므로 make이동이 성공했는지 여부를 알 수 없다는 것입니다.

cp그러나 대신 (복사)를 사용하면 mv좋을 것입니다 . cp -n대상 파일이 존재하면 1(0이 아닌)을 반환합니다. 따라서 솔루션(테스트 포함)은 다음과 같습니다.

install:
  cp -n libsgtk.so ${DESTDIR}

유용한 질문입니다. PHONY의 대상을 알고 있나요 Makefile? install및 대상 에 사용해야 합니다 clean(참고: libsgtk.so에서도 삭제해야 함 clean).

관련 정보