Make
安裝到系統路徑時如何安裝共享庫?
我正在試驗如何使用
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 中進行檢查,或者是否應該使用其他一些工具來為我提供替代安裝路徑?
我認為你應該使用變數。例如:
DESTDIR?=/usr/local/lib ... install: mv libsgtk.so ${DESTDIR}
make DESTDIR=/usr/lib
在這種情況下,使用者可以用(注意?
上面)覆蓋預設值。如果你願意,你可以測試它。也許這不是一個壞主意。更簡單的方法是使用
mv -n
(ormv -nv
) 而不是mv
: 不會覆蓋現有文件。它的主要缺點是返回值mv
為零,因此make
不會知道移動沒有成功。但是,如果您使用
cp
(copy) 代替mv
它會很好:cp -n
當目標文件存在時返回 1(非零)。所以解決方案(包括測試):install: cp -n libsgtk.so ${DESTDIR}
只有一個有幫助的問題:您知道 中的
PHONY
目標Makefile
嗎?您應該將它用於install
和clean
目標(備註:您也應該libsgtk.so
在 中刪除clean
)。