다음은 첫 번째 Makefile
시도 입니다 .libsgtk.so
Makefile
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
. 기존 파일을 덮어쓰지 않습니다. 가장 큰 단점은 반환 값이 mv
0이므로 make
이동이 성공했는지 여부를 알 수 없다는 것입니다.
cp
그러나 대신 (복사)를 사용하면 mv
좋을 것입니다 . cp -n
대상 파일이 존재하면 1(0이 아닌)을 반환합니다. 따라서 솔루션(테스트 포함)은 다음과 같습니다.
install:
cp -n libsgtk.so ${DESTDIR}
유용한 질문입니다. PHONY
의 대상을 알고 있나요 Makefile
? install
및 대상 에 사용해야 합니다 clean
(참고: libsgtk.so
에서도 삭제해야 함 clean
).